From cc9dae4deeb15c4a7611e3f5502946b070250e6c Mon Sep 17 00:00:00 2001
From: Eduardo Gonzalez <dabarren@gmail.com>
Date: Mon, 19 Nov 2018 19:47:09 +0100
Subject: [PATCH] Add glance-cache support

Glance cache is used to keep a locally cache image
in the glance_api service.
Is an usefull service when an image is commonly used
to speed times between pulling from storage backend
and send to nova.

Change-Id: I8e684cc10e4fee1cb52c17a126e3b11f69576cf6
---
 ansible/group_vars/all.yml                    |  1 +
 ansible/roles/glance/defaults/main.yml        |  8 +++++++-
 ansible/roles/glance/handlers/main.yml        |  1 +
 ansible/roles/glance/tasks/config.yml         | 20 +++++++++++++++++++
 .../roles/glance/templates/glance-api.conf.j2 |  7 ++++++-
 .../roles/glance/templates/glance-api.json.j2 |  6 ++++++
 .../glance/templates/glance-cache.conf.j2     | 19 ++++++++++++++++++
 etc/kolla/globals.yml                         |  1 +
 .../notes/glance-cache-ecf950ba3e9136b1.yaml  |  6 ++++++
 9 files changed, 67 insertions(+), 2 deletions(-)
 create mode 100644 ansible/roles/glance/templates/glance-cache.conf.j2
 create mode 100644 releasenotes/notes/glance-cache-ecf950ba3e9136b1.yaml

diff --git a/ansible/group_vars/all.yml b/ansible/group_vars/all.yml
index c6c94284b5..e2e5c9a5f4 100644
--- a/ansible/group_vars/all.yml
+++ b/ansible/group_vars/all.yml
@@ -672,6 +672,7 @@ openstack_auth:
 glance_backend_file: "{{ not (glance_backend_ceph | bool or glance_backend_swift | bool or glance_backend_vmware | bool) }}"
 glance_backend_ceph: "{{ enable_ceph }}"
 glance_backend_vmware: "no"
+enable_glance_image_cache: "no"
 # ceph backend has priority over swift in all-ceph clusters
 glance_backend_swift: "{{ not (enable_ceph | bool) and enable_swift | bool }}"
 glance_file_datadir_volume: "glance"
diff --git a/ansible/roles/glance/defaults/main.yml b/ansible/roles/glance/defaults/main.yml
index 8f1764a43f..2e87802c0a 100644
--- a/ansible/roles/glance/defaults/main.yml
+++ b/ansible/roles/glance/defaults/main.yml
@@ -151,7 +151,7 @@ openstack_glance_auth: "{{ openstack_auth }}"
 
 ###################
 # Kolla
-####################
+###################
 glance_git_repository: "{{ kolla_dev_repos_git }}/{{ project_name }}"
 glance_dev_repos_pull: "{{ kolla_dev_repos_pull }}"
 glance_dev_mode: "{{ kolla_dev_mode }}"
@@ -162,3 +162,9 @@ glance_source_version: "{{ kolla_source_version }}"
 ################################################
 vmware_vcenter_name:
 vmware_datastore_name:
+
+###################
+# Glance cache
+###################
+# Default maximum size of 10Gb
+glance_cache_max_size: "10737418240"
diff --git a/ansible/roles/glance/handlers/main.yml b/ansible/roles/glance/handlers/main.yml
index ff367fe997..96f66a638b 100644
--- a/ansible/roles/glance/handlers/main.yml
+++ b/ansible/roles/glance/handlers/main.yml
@@ -21,6 +21,7 @@
     - inventory_hostname in glance_api_hosts
     - service.enabled | bool
     - config_json.changed | bool
+      or glance_cache_conf.changed | bool
       or glance_conf.changed | bool
       or glance_swift_conf.changed | bool
       or policy_overwriting.changed | bool
diff --git a/ansible/roles/glance/tasks/config.yml b/ansible/roles/glance/tasks/config.yml
index e7c459555f..5e1050fdd3 100644
--- a/ansible/roles/glance/tasks/config.yml
+++ b/ansible/roles/glance/tasks/config.yml
@@ -76,6 +76,26 @@
     - Restart glance-api container
     - Restart glance-registry container
 
+- name: Copying over glance-cache.conf for glance_api
+  vars:
+    glance_api: "{{ glance_services['glance-api'] }}"
+  merge_configs:
+    sources:
+      - "{{ role_path }}/templates/glance-cache.conf.j2"
+      - "{{ node_custom_config }}/glance-cache.conf"
+      - "{{ node_custom_config }}/glance/glance-cache.conf"
+      - "{{ node_custom_config }}/glance/{{ inventory_hostname }}/glance-cache.conf"
+    dest: "{{ node_config_directory }}/glance-api/glance-cache.conf"
+    mode: "0660"
+  become: true
+  register: glance_cache_conf
+  when:
+    - glance_api.enabled | bool
+    - inventory_hostname in groups[glance_api.group]
+    - enable_glance_image_cache | bool
+  notify:
+    - Restart glance-api container
+
 - name: Copying over glance-swift.conf for glance_api
   vars:
     glance_api: "{{ glance_services['glance-api'] }}"
diff --git a/ansible/roles/glance/templates/glance-api.conf.j2 b/ansible/roles/glance/templates/glance-api.conf.j2
index 5608c39106..ec5cd0fb97 100644
--- a/ansible/roles/glance/templates/glance-api.conf.j2
+++ b/ansible/roles/glance/templates/glance-api.conf.j2
@@ -19,6 +19,11 @@ cinder_catalog_info = volume:cinder:internalURL
 
 transport_url = {{ rpc_transport_url }}
 
+{% if enable_glance_image_cache | bool %}
+image_cache_max_size = {{ glance_cache_max_size }}
+image_cache_dir = /var/lib/glance/image-cache
+{% endif %}
+
 [database]
 connection = mysql+pymysql://{{ glance_database_user }}:{{ glance_database_password }}@{{ glance_database_address }}/{{ glance_database_name }}
 max_retries = -1
@@ -38,7 +43,7 @@ memcache_secret_key = {{ memcache_secret_key }}
 memcached_servers = {% for host in groups['memcached'] %}{{ hostvars[host]['ansible_' + hostvars[host]['api_interface']]['ipv4']['address'] }}:{{ memcached_port }}{% if not loop.last %},{% endif %}{% endfor %}
 
 [paste_deploy]
-flavor = keystone
+flavor = {% if enable_glance_image_cache | bool %}keystone+cachemanagement{% else %}keystone{% endif %}
 
 [glance_store]
 {% if glance_backend_vmware | bool %}
diff --git a/ansible/roles/glance/templates/glance-api.json.j2 b/ansible/roles/glance/templates/glance-api.json.j2
index 89f330ae23..fd2bd70d62 100644
--- a/ansible/roles/glance/templates/glance-api.json.j2
+++ b/ansible/roles/glance/templates/glance-api.json.j2
@@ -24,6 +24,12 @@
             "dest": "/etc/glance/glance-swift.conf",
             "owner": "glance",
             "perm": "0600"
+        }{% endif %}{% if enable_glance_image_cache | bool %},
+        {
+            "source": "{{ container_config_directory }}/glance-cache.conf",
+            "dest": "/etc/glance/glance-cache.conf",
+            "owner": "glance",
+            "perm": "0600"
         }{% endif %}
     ],
     "permissions": [
diff --git a/ansible/roles/glance/templates/glance-cache.conf.j2 b/ansible/roles/glance/templates/glance-cache.conf.j2
new file mode 100644
index 0000000000..66aef9b590
--- /dev/null
+++ b/ansible/roles/glance/templates/glance-cache.conf.j2
@@ -0,0 +1,19 @@
+[DEFAULT]
+
+debug = {{ glance_logging_debug }}
+log_file = /var/log/kolla/glance/glance-cache.log
+
+image_cache_max_size = {{ glance_cache_max_size }}
+image_cache_dir = /var/lib/glance/image-cache
+
+auth_url = {{ admin_protocol }}://{{ kolla_internal_fqdn }}:{{ keystone_admin_port }}
+admin_password = {{ glance_keystone_password }}
+admin_user = {{ glance_keystone_user }}
+admin_tenant_name = {{ default_project_domain_id }}
+
+registry_host = {{ api_interface_address }}
+registry_port = {{ glance_registry_port }}
+
+{% if glance_backend_file | bool %}
+filesystem_store_datadir = /var/lib/glance/images/
+{% endif %}
diff --git a/etc/kolla/globals.yml b/etc/kolla/globals.yml
index 8244143758..d159b45e07 100644
--- a/etc/kolla/globals.yml
+++ b/etc/kolla/globals.yml
@@ -346,6 +346,7 @@ kolla_internal_vip_address: "10.10.10.254"
 #glance_backend_file: "yes"
 #glance_backend_swift: "no"
 #glance_backend_vmware: "no"
+#enable_glance_image_cache: "no"
 # Configure glance upgrade option, due to this feature is experimental
 # in glance, so default value should be set to "no".
 glance_enable_rolling_upgrade: "no"
diff --git a/releasenotes/notes/glance-cache-ecf950ba3e9136b1.yaml b/releasenotes/notes/glance-cache-ecf950ba3e9136b1.yaml
new file mode 100644
index 0000000000..190e2169f5
--- /dev/null
+++ b/releasenotes/notes/glance-cache-ecf950ba3e9136b1.yaml
@@ -0,0 +1,6 @@
+---
+features:
+  - |
+    Add support to configure glance-cache, enabled with
+    ``enable_glance_image_cache`` and configure cache size
+    with ``glance_cache_max_size``.