From c677ad7b847781f1a29f9334d2e030bf8a870282 Mon Sep 17 00:00:00 2001
From: Jean-Philippe Evrard <jean-philippe@evrard.me>
Date: Tue, 9 Feb 2016 12:46:50 +0100
Subject: [PATCH] Only update apt cache if necessary

Workarounding the upstream ansible apt module bug
documented here:
https://github.com/ansible/ansible-modules-core/pull/1517

For the next versions of ansible we'll be using, we should
check if the apt bug is fixed. When it's fixed, we could
abandon this change and use the standard apt module
with correct cache handling.

Change-Id: I2aaf00da175f31d0157bbc4ae30a4e176b055078
---
 defaults/main.yml                    |  3 +++
 tasks/nova_compute_kvm_install.yml   | 19 +++++++++++++------
 tasks/nova_console_novnc_install.yml | 18 ++++++++++++------
 tasks/nova_console_spice_install.yml | 19 +++++++++++++------
 tasks/nova_install.yml               | 18 ++++++++++++------
 5 files changed, 53 insertions(+), 24 deletions(-)

diff --git a/defaults/main.yml b/defaults/main.yml
index efcf32d3..1e1c609c 100644
--- a/defaults/main.yml
+++ b/defaults/main.yml
@@ -20,6 +20,9 @@ nova_ceilometer_enabled: False
 debug: False
 verbose: True
 
+## APT Cache options
+cache_timeout: 600
+
 # Name of the virtual env to deploy into
 nova_venv_tag: untagged
 nova_venv_bin: "/openstack/venvs/nova-{{ nova_venv_tag }}/bin"
diff --git a/tasks/nova_compute_kvm_install.yml b/tasks/nova_compute_kvm_install.yml
index 40b6231d..90ffcea5 100644
--- a/tasks/nova_compute_kvm_install.yml
+++ b/tasks/nova_compute_kvm_install.yml
@@ -13,14 +13,21 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-- name: Update apt sources
+#TODO(evrardjp): Replace the next 2 tasks by a standard apt with cache
+#when https://github.com/ansible/ansible-modules-core/pull/1517 is merged
+#in 1.9.x or we move to 2.0 (if tested working)
+- name: Check apt last update file
+  stat:
+    path: /var/cache/apt
+  register: apt_cache_stat
+  tags:
+    - nova-apt-packages
+    - nova-compute-kvm-apt-packages
+
+- name: Update apt if needed
   apt:
     update_cache: yes
-    cache_valid_time: 600
-  register: apt_update
-  until: apt_update|success
-  retries: 5
-  delay: 2
+  when: "ansible_date_time.epoch|float - apt_cache_stat.stat.mtime > {{cache_timeout}}"
   tags:
     - nova-apt-packages
     - nova-compute-kvm-apt-packages
diff --git a/tasks/nova_console_novnc_install.yml b/tasks/nova_console_novnc_install.yml
index 8ef6819c..08273eb5 100644
--- a/tasks/nova_console_novnc_install.yml
+++ b/tasks/nova_console_novnc_install.yml
@@ -29,14 +29,20 @@
     - nova-install
     - nova-novnc-git
 
-- name: Update apt sources
+#TODO(evrardjp): Replace the next 2 tasks by a standard apt with cache
+#when https://github.com/ansible/ansible-modules-core/pull/1517 is merged
+#in 1.9.x or we move to 2.0 (if tested working)
+- name: Check apt last update file
+  stat:
+    path: /var/cache/apt
+  register: apt_cache_stat
+  tags:
+    - nova-apt-packages
+
+- name: Update apt if needed
   apt:
     update_cache: yes
-    cache_valid_time: 600
-  register: apt_update
-  until: apt_update|success
-  retries: 5
-  delay: 2
+  when: "ansible_date_time.epoch|float - apt_cache_stat.stat.mtime > {{cache_timeout}}"
   tags:
     - nova-apt-packages
     - nova-novnc-apt-packages
diff --git a/tasks/nova_console_spice_install.yml b/tasks/nova_console_spice_install.yml
index 5086bf47..353cde81 100644
--- a/tasks/nova_console_spice_install.yml
+++ b/tasks/nova_console_spice_install.yml
@@ -13,14 +13,21 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-- name: Update apt sources
+#TODO(evrardjp): Replace the next 2 tasks by a standard apt with cache
+#when https://github.com/ansible/ansible-modules-core/pull/1517 is merged
+#in 1.9.x or we move to 2.0 (if tested working)
+- name: Check apt last update file
+  stat:
+    path: /var/cache/apt
+  register: apt_cache_stat
+  tags:
+    - nova-apt-packages
+    - nova-spice-apt-packages
+
+- name: Update apt if needed
   apt:
     update_cache: yes
-    cache_valid_time: 600
-  register: apt_update
-  until: apt_update|success
-  retries: 5
-  delay: 2
+  when: "ansible_date_time.epoch|float - apt_cache_stat.stat.mtime > {{cache_timeout}}"
   tags:
     - nova-apt-packages
     - nova-spice-apt-packages
diff --git a/tasks/nova_install.yml b/tasks/nova_install.yml
index 58b6204e..7bea71a9 100644
--- a/tasks/nova_install.yml
+++ b/tasks/nova_install.yml
@@ -13,14 +13,20 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-- name: Update apt sources
+#TODO(evrardjp): Replace the next 2 tasks by a standard apt with cache
+#when https://github.com/ansible/ansible-modules-core/pull/1517 is merged
+#in 1.9.x or we move to 2.0 (if tested working)
+- name: Check apt last update file
+  stat:
+    path: /var/cache/apt
+  register: apt_cache_stat
+  tags:
+    - nova-apt-packages
+
+- name: Update apt if needed
   apt:
     update_cache: yes
-    cache_valid_time: 600
-  register: apt_update
-  until: apt_update|success
-  retries: 5
-  delay: 2
+  when: "ansible_date_time.epoch|float - apt_cache_stat.stat.mtime > {{cache_timeout}}"
   tags:
     - nova-apt-packages