Merge pull request #22 from mnederlof/enable_v1_api
Allow enabling the v1 api (though it is deprecated)
diff --git a/.kitchen.yml b/.kitchen.yml
index 5524d0d..fef968f 100644
--- a/.kitchen.yml
+++ b/.kitchen.yml
@@ -41,9 +41,9 @@
platforms:
- - name: <%=ENV['PLATFORM'] || 'ubuntu-xenial'%>
+ - name: <%=ENV['PLATFORM'] || 'saltstack-ubuntu-xenial-salt-stable' %>
driver_config:
- image: <%=ENV['PLATFORM'] || 'trevorj/salty-whales:xenial'%>
+ image: <%=ENV['PLATFORM'] || 'epcim/salt:saltstack-ubuntu-xenial-salt-stable'%>
platform: ubuntu
suites:
diff --git a/.travis.yml b/.travis.yml
index 1a41dc1..6d2d1ac 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,3 +1,6 @@
+language: python
+python:
+- "2.7.13"
sudo: required
services:
- docker
@@ -17,14 +20,22 @@
- bundle install
env:
- - PLATFORM=trevorj/salty-whales:trusty SUITE=cluster
- - PLATFORM=trevorj/salty-whales:xenial SUITE=cluster
- - PLATFORM=trevorj/salty-whales:trusty SUITE=single-ceph
- - PLATFORM=trevorj/salty-whales:xenial SUITE=single-ceph
- - PLATFORM=trevorj/salty-whales:trusty SUITE=single-barbican
- - PLATFORM=trevorj/salty-whales:xenial SUITE=single-barbican
- - PLATFORM=trevorj/salty-whales:trusty SUITE=single
- - PLATFORM=trevorj/salty-whales:xenial SUITE=single
+ - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2017.7 SUITE=cluster
+ - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2017.7 SUITE=single-ceph
+ - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2017.7 SUITE=single-barbican
+ - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2017.7 SUITE=single
+ - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2018.3 SUITE=cluster
+ - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2018.3 SUITE=single-ceph
+ - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2018.3 SUITE=single-barbican
+ - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2018.3 SUITE=single
+# - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2017.7 SUITE=cluster
+# - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2017.7 SUITE=single-ceph
+# - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2017.7 SUITE=single-barbican
+# - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2017.7 SUITE=single
+# - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2018.3 SUITE=cluster
+# - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2018.3 SUITE=single-ceph
+# - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2018.3 SUITE=single-barbican
+# - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2018.3 SUITE=single
before_script:
- set -o pipefail
diff --git a/Makefile b/Makefile
index 1043fbe..d166862 100644
--- a/Makefile
+++ b/Makefile
@@ -27,6 +27,7 @@
all:
@echo "make install - Install into DESTDIR"
+ @echo "make lint - Run lint tests"
@echo "make test - Run tests"
@echo "make kitchen - Run Kitchen CI tests (create, converge, verify)"
@echo "make clean - Cleanup after tests run"
@@ -45,6 +46,9 @@
[ -d $(DESTDIR)/$(RECLASSDIR)/service/$(FORMULANAME) ] || mkdir -p $(DESTDIR)/$(RECLASSDIR)/service/$(FORMULANAME)
cp -a metadata/service/* $(DESTDIR)/$(RECLASSDIR)/service/$(FORMULANAME)
+lint:
+ [ ! -d tests ] || (cd tests; ./run_tests.sh lint)
+
test:
[ ! -d tests ] || (cd tests; ./run_tests.sh)
@@ -65,7 +69,7 @@
[ ! -f debian/changelog ] || dch -v $(VERSION_MAJOR).$(NEW_MINOR_VERSION) -m --force-distribution -D `dpkg-parsechangelog -S Distribution` "New version"
make genchangelog-$(VERSION_MAJOR).$(NEW_MINOR_VERSION)
(git add -u; git commit -m "Version $(VERSION_MAJOR).$(NEW_MINOR_VERSION)")
- git tag -s -m $(NEW_MAJOR_VERSION) $(VERSION_MAJOR).$(NEW_MINOR_VERSION)
+ git tag -s -m $(VERSION_MAJOR).$(NEW_MINOR_VERSION) $(VERSION_MAJOR).$(NEW_MINOR_VERSION)
check-changes:
@git log --pretty=oneline --decorate $(VERSION)..HEAD | grep -Eqc '.*' || (echo "No new changes since version $(VERSION)"; exit 1)
diff --git a/README.rst b/README.rst
index a692ba0..0d49ea7 100644
--- a/README.rst
+++ b/README.rst
@@ -1,12 +1,11 @@
-==============
-Glance formula
-==============
+=====
+Usage
+=====
The Glance project provides services for discovering, registering, and
retrieving virtual machine images. Glance has a RESTful API that allows
querying of VM image metadata as well as retrieval of the actual image.
-
Sample pillars
==============
@@ -59,16 +58,17 @@
barbican:
enabled: true
-The pagination is controlled by the *api_limit_max* and *limit_param_default*
+The pagination is controlled by the ``api_limit_max`` and ``limit_param_default``
parameters as shown above:
-* *api_limit_max* defines the maximum number of records that the server will
- return.
+* ``api_limit_max``
+ Defines the maximum number of records that the server will return.
-* *limit_param_default* is the default *limit* parameter that
- applies if the request didn't defined it explicitly.
+* ``limit_param_default``
+ The default ``limit`` parameter that applies if the request didn't define
+ it explicitly.
-Configuration of policy.json file
+Configuration of the ``policy.json`` file:
.. code-block:: yaml
@@ -79,6 +79,7 @@
publicize_image: "role:admin"
# Add key without value to remove line from policy.json
add_member:
+
Keystone and cinder region
.. code-block:: yaml
@@ -109,6 +110,31 @@
chunk_size: 8
client_glance_key: AQDOavlU6BsSJhAAnpFR906mvdgdfRqLHwu0Uw==
+VMWare integration:
+
+.. code-block:: yaml
+
+ glance:
+ server
+ storage:
+ engine: vmware
+ default_store: vsphere
+ vmware:
+ enabled: true
+ server_host: 1.2.3.4
+ server_username: vmware_username
+ server_password: vmware_password
+ datastores:
+ data1:
+ name: datastore_name1
+ enabled: true
+ path: datacenter_name
+ weight: 10
+ data2:
+ name: datastore_name2
+ enabled: true
+ path: datacenter_name
+
RabbitMQ HA setup
.. code-block:: yaml
@@ -145,62 +171,57 @@
Configuring TLS communications
------------------------------
-
-**Note:** by default system wide installed CA certs are used, so ``cacert_file`` param is optional, as well as ``cacert``.
-
+.. note:: By default, system wide installed CA certs are used, so
+ ``cacert_file`` param is optional, as well as ``cacert``.
- **RabbitMQ TLS**
-.. code-block:: yaml
+ .. code-block:: yaml
- glance:
- server:
- message_queue:
- port: 5671
- ssl:
- enabled: True
- (optional) cacert: cert body if the cacert_file does not exists
- (optional) cacert_file: /etc/openstack/rabbitmq-ca.pem
- (optional) version: TLSv1_2
-
+ glance:
+ server:
+ message_queue:
+ port: 5671
+ ssl:
+ enabled: True
+ (optional) cacert: cert body if the cacert_file does not exists
+ (optional) cacert_file: /etc/openstack/rabbitmq-ca.pem
+ (optional) version: TLSv1_2
- **MySQL TLS**
-.. code-block:: yaml
+ .. code-block:: yaml
- glance:
- server:
- database:
- ssl:
- enabled: True
- (optional) cacert: cert body if the cacert_file does not exists
- (optional) cacert_file: /etc/openstack/mysql-ca.pem
+ glance:
+ server:
+ database:
+ ssl:
+ enabled: True
+ (optional) cacert: cert body if the cacert_file does not exists
+ (optional) cacert_file: /etc/openstack/mysql-ca.pem
- **Openstack HTTPS API**
+ Set the ``https`` as protocol at ``glance:server`` sections:
-Set the ``https`` as protocol at ``glance:server`` sections:
+ .. code-block:: yaml
-.. code-block:: yaml
-
- glance:
- server:
- identity:
- protocol: https
- (optional) cacert_file: /etc/openstack/proxy.pem
- registry:
- protocol: https
- (optional) cacert_file: /etc/openstack/proxy.pem
- storage:
- engine: cinder, swift
- cinder:
- protocol: https
+ glance:
+ server:
+ identity:
+ protocol: https
(optional) cacert_file: /etc/openstack/proxy.pem
- swift:
- store:
- (optional) cafile: /etc/openstack/proxy.pem
-
-
+ registry:
+ protocol: https
+ (optional) cacert_file: /etc/openstack/proxy.pem
+ storage:
+ engine: cinder, swift
+ cinder:
+ protocol: https
+ (optional) cacert_file: /etc/openstack/proxy.pem
+ swift:
+ store:
+ (optional) cafile: /etc/openstack/proxy.pem
Enable Glance Image Cache:
@@ -250,7 +271,8 @@
user: 2ec7966596504f59acc3a76b3b9d9291:glance-user
key: someRandomPassword
-Another way, which also supports multiple swift backends, can be configured like this:
+Another way, which also supports multiple swift backends, can be
+configured like this:
.. code-block:: yaml
@@ -274,7 +296,7 @@
user: 2ec7966596504f59acc3a76b3b9d9291:glance-user
key: someRandomPassword
-Enable CORS parameters
+Enable CORS parameters:
.. code-block:: yaml
@@ -290,6 +312,7 @@
Enable Viewing Multiple Locations
---------------------------------
+
If you want to expose all locations available (for example when you have
multiple backends configured), then you can configure this like so:
@@ -301,12 +324,12 @@
location_strategy: store_type
store_type_preference: rbd,swift,file
-Please note: the show_multiple_locations option is deprecated since Newton and is planned
- to be handled by policy files _only_ starting with the Pike release.
+.. note:: The ``show_multiple_locations`` option is deprecated since
+ Newton and is planned to be handled by policy files *only*
+ starting with the Pike release.
-This feature is convenient in a scenario when you have swift and rbd configured and want to
-benefit from rbd enhancements.
-
+This feature is convenient in a scenario when you have swift and rbd
+configured and want to benefit from rbd enhancements.
Barbican integration glance
---------------------------
@@ -343,12 +366,20 @@
By default logging.conf is disabled.
That is possible to enable per-binary logging.conf with new variables:
- * openstack_log_appender - set it to true to enable log_config_append for all OpenStack services;
- * openstack_fluentd_handler_enabled - set to true to enable FluentHandler for all Openstack services.
-Only WatchedFileHandler and FluentHandler are available.
+* ``openstack_log_appender``
+ Set to true to enable ``log_config_append`` for all OpenStack services
-Also it is possible to configure this with pillar:
+* ``openstack_fluentd_handler_enabled``
+ Set to true to enable FluentHandler for all Openstack services
+
+* ``openstack_ossyslog_handler_enabled``
+ Set to true to enable OSSysLogHandler for all Openstack services
+
+Only ``WatchedFileHandler``, ``OSSysLogHandler``, and ``FluentHandler``
+are available.
+
+Also, it is possible to configure this with pillar:
.. code-block:: yaml
@@ -361,90 +392,59 @@
enabled: true
fluentd:
enabled: true
+ ossyslog:
+ enabled: true
Usage
=====
-Import new public image
+#. Import new public image:
-.. code-block:: yaml
+ .. code-block:: yaml
glance image-create --name 'Windows 7 x86_64' --is-public true --container-format bare --disk-format qcow2 < ./win7.qcow2
-Change new image's disk properties
+#. Change new image's disk properties
-.. code-block:: yaml
+ .. code-block:: yaml
glance image-update "Windows 7 x86_64" --property hw_disk_bus=ide
-Change new image's NIC properties
+#. Change new image's NIC properties
-.. code-block:: yaml
+ .. code-block:: yaml
glance image-update "Windows 7 x86_64" --property hw_vif_model=rtl8139
-External links
-==============
+Read more
+==========
* http://ceph.com/docs/master/rbd/rbd-openstack/
-
Documentation and Bugs
======================
-To learn how to deploy OpenStack Salt, consult the documentation available
-online at:
+* http://salt-formulas.readthedocs.io/
+ Learn how to install and update salt-formulas
- https://wiki.openstack.org/wiki/OpenStackSalt
+* https://github.com/salt-formulas/salt-formula-glance/issues
+ In the unfortunate event that bugs are discovered, report the issue to the
+ appropriate issue tracker. Use the Github issue tracker for a specific salt
+ formula
-In the unfortunate event that bugs are discovered, they should be reported to
-the appropriate bug tracker. If you obtained the software from a 3rd party
-operating system vendor, it is often wise to use their own bug tracker for
-reporting problems. In all other cases use the master OpenStack bug tracker,
-available at:
+* https://launchpad.net/salt-formulas
+ For feature requests, bug reports, or blueprints affecting the entire
+ ecosystem, use the Launchpad salt-formulas project
- http://bugs.launchpad.net/openstack-salt
+* https://launchpad.net/~salt-formulas-users
+ Join the salt-formulas-users team and subscribe to mailing list if required
-Developers wishing to work on the OpenStack Salt project should always base
-their work on the latest formulas code, available from the master GIT
-repository at:
+* https://github.com/salt-formulas/salt-formula-glance
+ Develop the salt-formulas projects in the master branch and then submit pull
+ requests against a specific formula
- https://git.openstack.org/cgit/openstack/salt-formula-glance
+* #salt-formulas @ irc.freenode.net
+ Use this IRC channel in case of any questions or feedback which is always
+ welcome
-Developers should also join the discussion on the IRC list, at:
-
- https://wiki.openstack.org/wiki/Meetings/openstack-salt
-
-Documentation and Bugs
-======================
-
-To learn how to install and update salt-formulas, consult the documentation
-available online at:
-
- http://salt-formulas.readthedocs.io/
-
-In the unfortunate event that bugs are discovered, they should be reported to
-the appropriate issue tracker. Use Github issue tracker for specific salt
-formula:
-
- https://github.com/salt-formulas/salt-formula-glance/issues
-
-For feature requests, bug reports or blueprints affecting entire ecosystem,
-use Launchpad salt-formulas project:
-
- https://launchpad.net/salt-formulas
-
-You can also join salt-formulas-users team and subscribe to mailing list:
-
- https://launchpad.net/~salt-formulas-users
-
-Developers wishing to work on the salt-formulas projects should always base
-their work on master branch and submit pull request against specific formula.
-
- https://github.com/salt-formulas/salt-formula-glance
-
-Any questions or feedback is always welcome so feel free to join our IRC
-channel:
-
- #salt-formulas @ irc.freenode.net
diff --git a/_modules/glanceng.py b/_modules/glanceng.py
index 0de0a85..080de42 100644
--- a/_modules/glanceng.py
+++ b/_modules/glanceng.py
@@ -54,11 +54,8 @@
__version__,
SaltStackVersion
)
-# is there not SaltStackVersion.current() to get
-# the version of the salt running this code??
-_version_ary = __version__.split('.')
-CUR_VER = SaltStackVersion(_version_ary[0], _version_ary[1])
-BORON = SaltStackVersion.from_name('Boron')
+
+from salt.utils import warn_until
# pylint: disable=import-error
HAS_GLANCE = False
@@ -69,15 +66,6 @@
except ImportError:
pass
-# Workaround, as the Glance API v2 requires you to
-# already have a keystone session token
-HAS_KEYSTONE = False
-try:
- from keystoneclient.v2_0 import client as kstone
- HAS_KEYSTONE = True
-except ImportError:
- pass
-
logging.basicConfig(level=logging.DEBUG)
log = logging.getLogger(__name__)
@@ -91,9 +79,6 @@
if not HAS_GLANCE:
return False, ("The glance execution module cannot be loaded: "
"the glanceclient python library is not available.")
- if not HAS_KEYSTONE:
- return False, ("The keystone execution module cannot be loaded: "
- "the keystoneclient python library is not available.")
return True
@@ -109,76 +94,10 @@
Only intended to be used within glance-enabled modules
'''
- if profile:
- prefix = profile + ":keystone."
- else:
- prefix = "keystone."
-
- def get(key, default=None):
- '''
- Checks connection_args, then salt-minion config,
- falls back to specified default value.
- '''
- return connection_args.get('connection_' + key,
- __salt__['config.get'](prefix + key, default))
-
- user = get('user', 'admin')
- password = get('password', None)
- tenant = get('tenant', 'admin')
- tenant_id = get('tenant_id')
- auth_url = get('auth_url', 'http://127.0.0.1:35357/v2.0')
- insecure = get('insecure', False)
- admin_token = get('token')
- region = get('region')
- ks_endpoint = get('endpoint', 'http://127.0.0.1:9292/')
- g_endpoint_url = __salt__['keystone.endpoint_get']('glance', profile)
- # The trailing 'v2' causes URLs like thise one:
- # http://127.0.0.1:9292/v2/v1/images
- g_endpoint_url = re.sub('/v2', '', g_endpoint_url['internalurl'])
-
- if admin_token and api_version != 1 and not password:
- # If we had a password we could just
- # ignore the admin-token and move on...
- raise SaltInvocationError('Only can use keystone admin token '
- 'with Glance API v1')
- elif password:
- # Can't use the admin-token anyway
- kwargs = {'username': user,
- 'password': password,
- 'tenant_id': tenant_id,
- 'auth_url': auth_url,
- 'endpoint_url': g_endpoint_url,
- 'region_name': region,
- 'tenant_name': tenant}
- # 'insecure' keyword not supported by all v2.0 keystone clients
- # this ensures it's only passed in when defined
- if insecure:
- kwargs['insecure'] = True
- elif api_version == 1 and admin_token:
- kwargs = {'token': admin_token,
- 'auth_url': auth_url,
- 'endpoint_url': g_endpoint_url}
- else:
- raise SaltInvocationError('No credentials to authenticate with.')
-
- if HAS_KEYSTONE:
- log.debug('Calling keystoneclient.v2_0.client.Client(' +
- '{0}, **{1})'.format(ks_endpoint, kwargs))
- keystone = kstone.Client(**kwargs)
- kwargs['token'] = keystone.get_token(keystone.session)
- # This doesn't realy prevent the password to show up
- # in the minion log as keystoneclient.session is
- # logging it anyway when in debug-mode
- kwargs.pop('password')
- log.debug('Calling glanceclient.client.Client(' +
- '{0}, {1}, **{2})'.format(api_version,
- g_endpoint_url, kwargs))
- # may raise exc.HTTPUnauthorized, exc.HTTPNotFound
- # but we deal with those elsewhere
- return client.Client(api_version, g_endpoint_url, **kwargs)
- else:
- raise NotImplementedError(
- "Can't retrieve a auth_token without keystone")
+ kstone = __salt__['keystoneng.auth'](profile, **connection_args)
+ g_endpoint = __salt__['keystoneng.endpoint_get']('glance', profile=profile)
+ glance_client = client.Client(api_version, session=kstone.session, endpoint=g_endpoint.get('url'))
+ return glance_client
def _validate_image_params(visibility=None, container_format='bare',
@@ -376,3 +295,311 @@
log.debug('Properties of schema {0}:\n{1}'.format(
name, pformat(schema_props)))
return {name: schema_props}
+
+def image_list(id=None, profile=None, name=None): # pylint: disable=C0103
+ '''
+ Return a list of available images (glance image-list)
+
+ CLI Example:
+
+ .. code-block:: bash
+
+ salt '*' glance.image_list
+ '''
+
+ g_client = _auth(profile)
+ ret = []
+ for image in g_client.images.list():
+ if id is None and name is None:
+ _add_image(ret, image)
+ else:
+ if id is not None and id == image.id:
+ _add_image(ret, image)
+ return ret
+ if name == image.name:
+ if name in ret:
+ # Not really worth an exception
+ return {
+ 'result': False,
+ 'comment':
+ 'More than one image with '
+ 'name "{0}"'.format(name)
+ }
+ _add_image(ret, image)
+ log.debug('Returning images: {0}'.format(ret))
+ return ret
+
+def _add_image(collection, image):
+ '''
+ Add image to given dictionary
+ '''
+ image_prep = {
+ 'id': image.id,
+ 'name': image.name,
+ 'created_at': image.created_at,
+ 'file': image.file,
+ 'min_disk': image.min_disk,
+ 'min_ram': image.min_ram,
+ 'owner': image.owner,
+ 'protected': image.protected,
+ 'status': image.status,
+ 'tags': image.tags,
+ 'updated_at': image.updated_at,
+ 'visibility': image.visibility,
+ }
+ # Those cause AttributeErrors in Icehouse' glanceclient
+ for attr in ['container_format', 'disk_format', 'size']:
+ if attr in image:
+ image_prep[attr] = image[attr]
+ if type(collection) is dict:
+ collection[image.name] = image_prep
+ elif type(collection) is list:
+ collection.append(image_prep)
+ else:
+ msg = '"collection" is {0}'.format(type(collection)) +\
+ 'instead of dict or list.'
+ log.error(msg)
+ raise TypeError(msg)
+ return collection
+
+def image_create(name, location=None, profile=None, visibility=None,
+ container_format='bare', disk_format='raw', protected=None,
+ copy_from=None, is_public=None):
+ '''
+ Create an image (glance image-create)
+
+ CLI Example, old format:
+
+ .. code-block:: bash
+
+ salt '*' glance.image_create name=f16-jeos is_public=true \\
+ disk_format=qcow2 container_format=ovf \\
+ copy_from=http://berrange.fedorapeople.org/\
+ images/2012-02-29/f16-x86_64-openstack-sda.qcow2
+
+ CLI Example, new format resembling Glance API v2:
+
+ .. code-block:: bash
+
+ salt '*' glance.image_create name=f16-jeos visibility=public \\
+ disk_format=qcow2 container_format=ovf \\
+ copy_from=http://berrange.fedorapeople.org/\
+ images/2012-02-29/f16-x86_64-openstack-sda.qcow2
+
+ The parameter 'visibility' defaults to 'public' if neither
+ 'visibility' nor 'is_public' is specified.
+ '''
+ kwargs = {}
+ # valid options for "visibility":
+ v_list = ['public', 'private']
+ # valid options for "container_format":
+ cf_list = ['ami', 'ari', 'aki', 'bare', 'ovf']
+ # valid options for "disk_format":
+ df_list = ['ami', 'ari', 'aki', 'vhd', 'vmdk',
+ 'raw', 'qcow2', 'vdi', 'iso']
+ # 'location' and 'visibility' are the parameters used in
+ # Glance API v2. For now we have to use v1 for now (see below)
+ # but this modules interface will change in Carbon.
+ if copy_from is not None or is_public is not None:
+ warn_until('Carbon', 'The parameters \'copy_from\' and '
+ '\'is_public\' are deprecated and will be removed. '
+ 'Use \'location\' and \'visibility\' instead.')
+ if is_public is not None and visibility is not None:
+ raise SaltInvocationError('Must only specify one of '
+ '\'is_public\' and \'visibility\'')
+ if copy_from is not None and location is not None:
+ raise SaltInvocationError('Must only specify one of '
+ '\'copy_from\' and \'location\'')
+ if copy_from is not None:
+ kwargs['copy_from'] = copy_from
+ else:
+ kwargs['copy_from'] = location
+ if is_public is not None:
+ kwargs['is_public'] = is_public
+ elif visibility is not None:
+ if visibility not in v_list:
+ raise SaltInvocationError('"visibility" needs to be one ' +
+ 'of the following: {0}'.format(', '.join(v_list)))
+ elif visibility == 'public':
+ kwargs['is_public'] = True
+ else:
+ kwargs['is_public'] = False
+ else:
+ kwargs['is_public'] = True
+ if container_format not in cf_list:
+ raise SaltInvocationError('"container_format" needs to be ' +
+ 'one of the following: {0}'.format(', '.join(cf_list)))
+ else:
+ kwargs['container_format'] = container_format
+ if disk_format not in df_list:
+ raise SaltInvocationError('"disk_format" needs to be one ' +
+ 'of the following: {0}'.format(', '.join(df_list)))
+ else:
+ kwargs['disk_format'] = disk_format
+ if protected is not None:
+ kwargs['protected'] = protected
+ # Icehouse's glanceclient doesn't have add_location() and
+ # glanceclient.v2 doesn't implement Client.images.create()
+ # in a usable fashion. Thus we have to use v1 for now.
+ g_client = _auth(profile, api_version=1)
+ image = g_client.images.create(name=name, **kwargs)
+ return image_show(image.id, profile=profile)
+
+def image_delete(id=None, name=None, profile=None): # pylint: disable=C0103
+ '''
+ Delete an image (glance image-delete)
+
+ CLI Examples:
+
+ .. code-block:: bash
+
+ salt '*' glance.image_delete c2eb2eb0-53e1-4a80-b990-8ec887eae7df
+ salt '*' glance.image_delete id=c2eb2eb0-53e1-4a80-b990-8ec887eae7df
+ salt '*' glance.image_delete name=f16-jeos
+ '''
+ g_client = _auth(profile)
+ image = {'id': False, 'name': None}
+ if name:
+ for image in g_client.images.list():
+ if image.name == name:
+ id = image.id # pylint: disable=C0103
+ continue
+ if not id:
+ return {
+ 'result': False,
+ 'comment':
+ 'Unable to resolve image id '
+ 'for name {0}'.format(name)
+ }
+ elif not name:
+ name = image['name']
+ try:
+ g_client.images.delete(id)
+ except exc.HTTPNotFound:
+ return {
+ 'result': False,
+ 'comment': 'No image with ID {0}'.format(id)
+ }
+ except exc.HTTPForbidden as forbidden:
+ log.error(str(forbidden))
+ return {
+ 'result': False,
+ 'comment': str(forbidden)
+ }
+ return {
+ 'result': True,
+ 'comment': 'Deleted image \'{0}\' ({1}).'.format(name, id),
+ }
+
+def image_show(id=None, name=None, profile=None): # pylint: disable=C0103
+ '''
+ Return details about a specific image (glance image-show)
+
+ CLI Example:
+
+ .. code-block:: bash
+
+ salt '*' glance.image_show
+ '''
+ g_client = _auth(profile)
+ ret = {}
+ if name:
+ for image in g_client.images.list():
+ if image.name == name:
+ id = image.id # pylint: disable=C0103
+ continue
+ if not id:
+ return {
+ 'result': False,
+ 'comment':
+ 'Unable to resolve image ID '
+ 'for name \'{0}\''.format(name)
+ }
+ try:
+ image = g_client.images.get(id)
+ except exc.HTTPNotFound:
+ return {
+ 'result': False,
+ 'comment': 'No image with ID {0}'.format(id)
+ }
+ pformat = pprint.PrettyPrinter(indent=4).pformat
+ log.debug('Properties of image {0}:\n{1}'.format(
+ image.name, pformat(image)))
+ schema = image_schema(profile=profile)
+ if len(schema.keys()) == 1:
+ schema = schema['image']
+ for key in schema.keys():
+ if key in image:
+ ret[key] = image[key]
+ return ret
+
+def image_update(id=None, name=None, profile=None, **kwargs): # pylint: disable=C0103
+ '''
+ Update properties of given image.
+ Known to work for:
+ - min_ram (in MB)
+ - protected (bool)
+ - visibility ('public' or 'private')
+
+ CLI Example:
+
+ .. code-block:: bash
+
+ salt '*' glance.image_update id=c2eb2eb0-53e1-4a80-b990-8ec887eae7df
+ salt '*' glance.image_update name=f16-jeos
+ '''
+ if id:
+ image = image_show(id=id, profile=profile)
+ if 'result' in image and not image['result']:
+ return image
+ elif len(image) == 1:
+ image = image.values()[0]
+ elif name:
+ img_list = image_list(name=name, profile=profile)
+ if img_list is dict and 'result' in img_list:
+ return img_list
+ elif len(img_list) == 0:
+ return {
+ 'result': False,
+ 'comment':
+ 'No image with name \'{0}\' '
+ 'found.'.format(name)
+ }
+ elif len(img_list) == 1:
+ try:
+ image = img_list[0]
+ except KeyError:
+ image = img_list[name]
+ else:
+ raise SaltInvocationError
+ log.debug('Found image:\n{0}'.format(image))
+ to_update = {}
+ for key, value in kwargs.items():
+ if key.startswith('_'):
+ continue
+ if key not in image or image[key] != value:
+ log.debug('add <{0}={1}> to to_update'.format(key, value))
+ to_update[key] = value
+ g_client = _auth(profile)
+ updated = g_client.images.update(image['id'], **to_update)
+ return updated
+
+def _item_list(profile=None):
+ '''
+ Template for writing list functions
+ Return a list of available items (glance items-list)
+
+ CLI Example:
+
+ .. code-block:: bash
+
+ salt '*' glance.item_list
+ '''
+ g_client = _auth(profile)
+ ret = []
+ for item in g_client.items.list():
+ ret.append(item.__dict__)
+ #ret[item.name] = {
+ # 'name': item.name,
+ # }
+ return ret
diff --git a/_modules/glancev2/__init__.py b/_modules/glancev2/__init__.py
new file mode 100644
index 0000000..8c7418b
--- /dev/null
+++ b/_modules/glancev2/__init__.py
@@ -0,0 +1,36 @@
+try:
+ import os_client_config
+ from keystoneauth1 import exceptions as ka_exceptions
+ REQUIREMENTS_MET = True
+except ImportError:
+ REQUIREMENTS_MET = False
+
+from glancev2 import image
+from glancev2 import task
+
+image_create = image.image_create
+image_delete = image.image_delete
+image_deactivate = image.image_deactivate
+image_reactivate = image.image_reactivate
+image_list = image.image_list
+image_update = image.image_update
+image_download = image.image_data_download
+image_get_details = image.image_get_details
+task_list = task.task_list
+task_create = task.task_create
+task_show = task.task_show
+
+__all__ = (
+ 'image_update', 'image_create', 'image_list', 'image_delete', 'task_show',
+ 'image_download', 'task_create', 'task_list', 'image_get_details',
+ 'image_deactivate', 'image_reactivate'
+)
+
+
+def __virtual__():
+ """Only load glanceng if requirements are available."""
+ if REQUIREMENTS_MET:
+ return 'glancev2'
+ else:
+ return False, ("The glanceng execution module cannot be loaded: "
+ "os_client_config or keystoneauth are unavailable.")
diff --git a/_modules/glancev2/common.py b/_modules/glancev2/common.py
new file mode 100644
index 0000000..79d93a0
--- /dev/null
+++ b/_modules/glancev2/common.py
@@ -0,0 +1,120 @@
+import logging
+import os_client_config
+from uuid import UUID
+
+log = logging.getLogger(__name__)
+
+
+class GlanceException(Exception):
+
+ _msg = "Glance module exception occured."
+
+ def __init__(self, message=None, **kwargs):
+ super(GlanceException, self).__init__(message or self._msg)
+
+
+class NoGlanceEndpoint(GlanceException):
+ _msg = "Glance endpoint not found in keystone catalog."
+
+
+class NoAuthPluginConfigured(GlanceException):
+ _msg = ("You are using keystoneauth auth plugin that does not support "
+ "fetching endpoint list from token (noauth or admin_token).")
+
+
+class NoCredentials(GlanceException):
+ _msg = "Please provide cloud name present in clouds.yaml."
+
+
+class ResourceNotFound(GlanceException):
+ _msg = "Uniq resource: {resource} with name: {name} not found."
+
+ def __init__(self, resource, name, **kwargs):
+ super(GlanceException, self).__init__(
+ self._msg.format(resource=resource, name=name))
+
+
+class MultipleResourcesFound(GlanceException):
+ _msg = "Multiple resource: {resource} with name: {name} found."
+
+ def __init__(self, resource, name, **kwargs):
+ super(GlanceException, self).__init__(
+ self._msg.format(resource=resource, name=name))
+
+
+def get_raw_client(cloud_name):
+ service_type = 'image'
+ config = os_client_config.OpenStackConfig()
+ cloud = config.get_one_cloud(cloud_name)
+ adapter = cloud.get_session_client(service_type)
+ adapter.version = '2'
+ try:
+ access_info = adapter.session.auth.get_access(adapter.session)
+ endpoints = access_info.service_catalog.get_endpoints()
+ except (AttributeError, ValueError) as exc:
+ log.exception('%s' % exc)
+ e = NoAuthPluginConfigured()
+ log.exception('%s' % e)
+ raise e
+ if service_type not in endpoints:
+ if not service_type:
+ e = NoGlanceEndpoint()
+ log.error('%s' % e)
+ raise e
+ return adapter
+
+
+def send(method):
+ def wrap(func):
+ def wrapped_f(*args, **kwargs):
+ cloud_name = kwargs.pop('cloud_name')
+ if not cloud_name:
+ e = NoCredentials()
+ log.error('%s' % e)
+ raise e
+ adapter = get_raw_client(cloud_name)
+ # Remove salt internal kwargs
+ kwarg_keys = list(kwargs.keys())
+ for k in kwarg_keys:
+ if k.startswith('__'):
+ kwargs.pop(k)
+ url, request_kwargs = func(*args, **kwargs)
+ response = getattr(adapter, method)(url, **request_kwargs)
+ if not response.content:
+ return {}
+ return response.json()
+ return wrapped_f
+ return wrap
+
+
+def _check_uuid(val):
+ try:
+ return str(UUID(val)).replace('-', '') == val.replace('-', '')
+ except (TypeError, ValueError, AttributeError):
+ return False
+
+
+def get_by_name_or_uuid(resource_list, resp_key):
+ def wrap(func):
+ def wrapped_f(*args, **kwargs):
+ if 'name' in kwargs:
+ ref = kwargs.pop('name', None)
+ start_arg = 0
+ else:
+ start_arg = 1
+ ref = args[0]
+ if _check_uuid(ref):
+ uuid = ref
+ else:
+ # Then we have name not uuid
+ cloud_name = kwargs['cloud_name']
+ resp = resource_list(
+ name=ref, cloud_name=cloud_name)[resp_key]
+ if len(resp) == 0:
+ raise ResourceNotFound(resp_key, ref)
+ elif len(resp) > 1:
+ raise MultipleResourcesFound(resp_key, ref)
+ uuid = resp[0]['id']
+ return func(uuid, *args[start_arg:], **kwargs)
+ return wrapped_f
+ return wrap
diff --git a/_modules/glancev2/image.py b/_modules/glancev2/image.py
new file mode 100644
index 0000000..660d71d
--- /dev/null
+++ b/_modules/glancev2/image.py
@@ -0,0 +1,102 @@
+try:
+ from urllib.parse import urlencode
+except ImportError:
+ from urllib import urlencode
+import hashlib
+
+from glancev2.common import send, get_raw_client, get_by_name_or_uuid
+
+RESOURCE_LIST_KEY = 'images'
+
+
+@send('get')
+def image_list(**kwargs):
+ url = '/images?{}'.format(urlencode(kwargs))
+ return url, {}
+
+
+@send('post')
+def image_create(**kwargs):
+ url = '/images'
+ return url, {'json': kwargs}
+
+
+@get_by_name_or_uuid(image_list, RESOURCE_LIST_KEY)
+@send('get')
+def image_get_details(image_id, **kwargs):
+ url = '/images/{}'.format(image_id)
+ return url, {}
+
+
+@get_by_name_or_uuid(image_list, RESOURCE_LIST_KEY)
+@send('patch')
+def image_update(image_id, properties, **kwargs):
+ url = '/images/{}'.format(image_id)
+ headers = {
+ 'Content-Type': 'application/openstack-images-v2.1-json-patch',
+ }
+ return url, {'json': properties, 'headers': headers}
+
+
+@get_by_name_or_uuid(image_list, RESOURCE_LIST_KEY)
+@send('delete')
+def image_delete(image_id, **kwargs):
+ url = '/images/{}'.format(image_id)
+ return url, {}
+
+
+@get_by_name_or_uuid(image_list, RESOURCE_LIST_KEY)
+@send('post')
+def image_deactivate(image_id, **kwargs):
+ url = '/images/{}/actions/deactivate'.format(image_id)
+ return url, {}
+
+
+@get_by_name_or_uuid(image_list, RESOURCE_LIST_KEY)
+@send('post')
+def image_reactivate(image_id, **kwargs):
+ url = '/images/{}/actions/reactivate'.format(image_id)
+ return url, {}
+
+
+class StreamingDownloader(object):
+
+ def __init__(self, adapter, image_id, chunksize):
+ self.hasher = hashlib.new('md5')
+ self.chunksize = chunksize
+
+ resp = adapter.get('/images/{}/file'.format(image_id),
+ stream=True)
+ if resp.status_code != 200:
+ raise Exception('Invalid response code: %s' % resp.status_code)
+
+ self._request = resp
+
+ def __iter__(self):
+ for chunk in self._request.iter_content(chunk_size=self.chunksize):
+ self.hasher.update(chunk)
+ yield chunk
+
+ def validate(self):
+ return self.hasher.hexdigest() == self._request.headers['Content-Md5']
+
+
+@get_by_name_or_uuid(image_list, RESOURCE_LIST_KEY)
+def image_data_download(image_id, file_name, **kwargs):
+ cloud_name = kwargs.pop('cloud_name')
+ adapter = get_raw_client(cloud_name)
+ downloader = StreamingDownloader(adapter, image_id, 1024 * 1024)
+ with open(file_name, 'wb') as f:
+ for chunk in downloader:
+ f.write(chunk)
+ return downloader.validate()
+
+
+@get_by_name_or_uuid(image_list, RESOURCE_LIST_KEY)
+@send('put')
+def image_data_upload(image_id, file_name, **kwargs):
+ url = '/images/{}/file'.format(image_id)
+ headers = {'Content-Type': 'application/octet-stream '}
+ with open(file_name, 'rb') as f:
+ data = f.readlines()
+ return url, {'json': data, 'headers': headers}
diff --git a/_modules/glancev2/task.py b/_modules/glancev2/task.py
new file mode 100644
index 0000000..41db829
--- /dev/null
+++ b/_modules/glancev2/task.py
@@ -0,0 +1,27 @@
+try:
+ from urllib.parse import urlencode
+except ImportError:
+ from urllib import urlencode
+from glancev2.common import send
+
+
+@send('post')
+def task_create(task_type, task_input, **kwargs):
+ url = '/tasks'
+ json = {
+ 'type': task_type,
+ 'input': task_input
+ }
+ return url, {'json': json}
+
+
+@send('get')
+def task_list(**kwargs):
+ url = '/tasks?{}'.format(urlencode(kwargs))
+ return url, {}
+
+
+@send('get')
+def task_show(task_id, **kwargs):
+ url = '/tasks/{}'.format(task_id)
+ return url, {}
diff --git a/_states/glanceng.py b/_states/glanceng.py
index e245866..e59dcbd 100644
--- a/_states/glanceng.py
+++ b/_states/glanceng.py
@@ -46,7 +46,7 @@
- False, 'Found more than one image with given name'
'''
try:
- images = __salt__['glance.image_list'](name=name, profile=profile)
+ images = __salt__['glanceng.image_list'](name=name, profile=profile)
except kstone_Unauthorized:
return False, 'keystoneclient: Unauthorized'
except glance_Unauthorized:
@@ -56,7 +56,7 @@
if type(images) is dict and len(images) == 1 and 'images' in images:
images = images['images']
- images_list = images.values() if type(images) is dict else images
+ images_list = list(images.values()) if type(images) is dict else images
if len(images_list) == 0:
return None, 'No image with name "{0}"'.format(name)
@@ -126,7 +126,7 @@
ret['comment'] = 'glance.image_present would ' \
'create an image from {0}'.format(location)
return ret
- image = __salt__['glance.image_create'](name=name, profile=profile,
+ image = __salt__['glanceng.image_create'](name=name, profile=profile,
protected=protected, visibility=visibility,
location=location, disk_format=disk_format)
log.debug('Created new image:\n{0}'.format(image))
@@ -184,7 +184,7 @@
if image['visibility'] != visibility:
old_value = image['visibility']
if not __opts__['test']:
- image = __salt__['glance.image_update'](
+ image = __salt__['glanceng.image_update'](
id=image['id'], visibility=visibility)
# Check if image_update() worked:
if image['visibility'] != visibility:
@@ -222,7 +222,7 @@
if image['status'] == 'active':
if 'checksum' not in image:
# Refresh our info about the image
- image = __salt__['glance.image_show'](image['id'])
+ image = __salt__['glanceng.image_show'](image['id'])
if 'checksum' not in image:
if not __opts__['test']:
ret['result'] = False
@@ -376,7 +376,7 @@
if image['status'] == 'active':
if 'checksum' not in image:
# Refresh our info about the image
- image = __salt__['glance.image_show'](image['id'])
+ image = __salt__['glanceng.image_show'](image['id'])
if 'checksum' not in image:
if not __opts__['test']:
ret['result'] = False
diff --git a/_states/glancev2.py b/_states/glancev2.py
new file mode 100644
index 0000000..2250e25
--- /dev/null
+++ b/_states/glancev2.py
@@ -0,0 +1,274 @@
+# -*- coding: utf-8 -*-
+'''
+Managing Images in OpenStack Glance
+===================================
+'''
+# Import python libs
+import logging
+import time
+
+
+# Import OpenStack libs
+def __virtual__():
+ return 'glancev2' if 'glancev2.image_list' in __salt__ else False
+
+
+log = logging.getLogger(__name__)
+
+
+def _glancev2_call(fname, *args, **kwargs):
+ return __salt__['glancev2.{}'.format(fname)](*args, **kwargs)
+
+
+def image_present(name, cloud_name, location, image_properties,
+ import_from_format='raw', timeout=30,
+ sleep_time=5, checksum=None):
+ """
+ Creates a task to import an image
+
+ This state checks if an image is present and, if not, creates a task
+ with import_type that would download an image from a remote location and
+ upload it to Glance.
+ After the task is created, its status is monitored. On success the state
+ would check that an image is present and return its ID.
+
+ Also, this state can update(add and replace) image properties,
+ but !!It can't delete properties, that are already in state
+
+ :param name: name of the image
+ :param cloud_name: name of the cloud in cloud.yaml
+ :param location: url link describing where to obtain image
+ :param image_properties: Dict that contains params needed
+ to create or update image.
+ :param container_format: Format of the container
+ :param disk_format: Format of the disk
+ :param protected: If true, image will not be deletable.
+ :param tags: List of strings related to the image
+ :param visibility: Scope of image accessibility.
+ Valid values: public, private, community, shared
+ :param import_from_format: (optional) Format to import the image from
+ :param timeout: (optional) Time for task to download image
+ :param sleep_time: (optional) Timer countdown
+ :param checksum: (optional) checksum of the image to verify it
+ """
+ try:
+ exact_image = _glancev2_call(
+ 'image_get_details', name=name, cloud_name=cloud_name
+ )
+ except Exception as e:
+ if 'ResourceNotFound' in repr(e):
+ image_properties['name'] = name
+ task_params = {"import_from": location,
+ "import_from_format": import_from_format,
+ "image_properties": image_properties
+ }
+ # Try create task
+ try:
+ task = _glancev2_call(
+ 'task_create', task_type='import', task_input=task_params,
+ cloud_name=cloud_name
+ )
+ except Exception as e:
+ log.error(
+ 'Glance image create failed on create task with {}'.format(
+ e)
+ )
+ return _create_failed(name, 'image_task')
+ while timeout > 0:
+ if task['status'] == 'success':
+ break
+ elif task['status'] == 'failure':
+ log.error('Glance task failed to complete')
+ return _create_failed(name, 'image')
+ else:
+ timeout -= sleep_time
+ time.sleep(sleep_time)
+ # Check task status again
+ try:
+ task = _glancev2_call(
+ 'task_show', task_id=task['id'],
+ cloud_name=cloud_name
+ )
+ except Exception as e:
+ log.error(
+ 'Glance failed to check '
+ 'task status with {}'.format(e)
+ )
+ return _create_failed(name, 'image_task')
+ if timeout <= 0 and task['status'] != 'success':
+ log.error(
+ 'Glance task failed to import '
+ 'image for given amount of time'
+ )
+ return _create_failed(name, 'image')
+ # Task successfully finished
+ # and now check that is created the image
+
+ image = _glancev2_call(
+ 'image_list', name=name, cloud_name=cloud_name
+ )['images'][0]
+
+ if not image:
+ return _create_failed(name, 'image')
+
+ resp = _created(name, 'image', image)
+
+ if checksum:
+ if image['status'] == 'active':
+ if 'checksum' not in image:
+ log.error(
+ 'Glance image. No checksum for image.'
+ 'Image status is active'
+ )
+ return _create_failed(name, 'image')
+ if image['checksum'] != checksum:
+ log.error(
+ 'Glance image create failed since '
+ 'image_checksum should be '
+ '{} but it is {}'.format(checksum,
+ image['checksum'])
+ )
+ return _create_failed(name, 'image')
+
+ elif image['status'] in ['saving', 'queued']:
+ resp['comment'] = resp['comment'] \
+ + " checksum couldn't be verified, " \
+ "since status is not active"
+ return resp
+ elif 'MultipleResourcesFound' in repr(e):
+ return _find_failed(name, 'image')
+ else:
+ raise
+
+ to_change = []
+ for prop in image_properties:
+ path = prop.replace('~', '~0').replace('/', '~1')
+ if prop in exact_image:
+ if exact_image[prop] != image_properties[prop]:
+ to_change.append({
+ 'op': 'replace',
+ 'path': '/{}'.format(path),
+ 'value': image_properties[prop]
+ })
+ else:
+ to_change.append({
+ 'op': 'add',
+ 'path': '/{}'.format(path),
+ 'value': image_properties[prop]
+ })
+ if to_change:
+ try:
+ resp = _glancev2_call(
+ 'image_update', name=name,
+ properties=to_change, cloud_name=cloud_name,
+ )
+ except Exception as e:
+ log.error('Glance image update failed with {}'.format(e))
+ return _update_failed(name, 'image')
+ return _updated(name, 'image', resp)
+ return _no_changes(name, 'image')
+
+
+def image_absent(name, cloud_name):
+ try:
+ image = _glancev2_call(
+ 'image_get_details', name=name, cloud_name=cloud_name
+ )
+ except Exception as e:
+ if 'ResourceNotFound' in repr(e):
+ return _absent(name, 'image')
+ if 'MultipleResourcesFound' in repr(e):
+ return _find_failed(name, 'image')
+ try:
+ _glancev2_call(
+ 'image_delete', name=name, cloud_name=cloud_name
+ )
+ except Exception as e:
+ log.error('Glance image delete failed with {}'.format(e))
+ return _delete_failed(name, 'image')
+ return _deleted(name, 'image')
+
+
+def _created(name, resource, resource_definition):
+ changes_dict = {
+ 'name': name,
+ 'changes': resource_definition,
+ 'result': True,
+ 'comment': '{}{} created'.format(resource, name)
+ }
+ return changes_dict
+
+
+def _updated(name, resource, resource_definition):
+ changes_dict = {
+ 'name': name,
+ 'changes': resource_definition,
+ 'result': True,
+ 'comment': '{}{} updated'.format(resource, name)
+ }
+ return changes_dict
+
+
+def _no_changes(name, resource):
+ changes_dict = {
+ 'name': name,
+ 'changes': {},
+ 'result': True,
+ 'comment': '{}{} is in desired state'.format(resource, name)
+ }
+ return changes_dict
+
+
+def _deleted(name, resource):
+ changes_dict = {
+ 'name': name,
+ 'changes': {},
+ 'result': True,
+ 'comment': '{}{} removed'.format(resource, name)
+ }
+ return changes_dict
+
+
+def _absent(name, resource):
+ changes_dict = {'name': name,
+ 'changes': {},
+ 'comment': '{0} {1} not present'.format(resource, name),
+ 'result': True}
+ return changes_dict
+
+
+def _delete_failed(name, resource):
+ changes_dict = {'name': name,
+ 'changes': {},
+ 'comment': '{0} {1} failed to delete'.format(resource,
+ name),
+ 'result': False}
+ return changes_dict
+
+
+def _create_failed(name, resource):
+ changes_dict = {'name': name,
+ 'changes': {},
+ 'comment': '{0} {1} failed to create'.format(resource,
+ name),
+ 'result': False}
+ return changes_dict
+
+
+def _update_failed(name, resource):
+ changes_dict = {'name': name,
+ 'changes': {},
+ 'comment': '{0} {1} failed to update'.format(resource,
+ name),
+ 'result': False}
+ return changes_dict
+
+
+def _find_failed(name, resource):
+ changes_dict = {
+ 'name': name,
+ 'changes': {},
+ 'comment': '{0} {1} found multiple {0}'.format(resource, name),
+ 'result': False,
+ }
+ return changes_dict
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..c76fcb8
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,44 @@
+salt-formula-glance (2016.12.1) xenial; urgency=medium
+
+ * Switch using 3.0 native source format
+
+ -- devops <devops@mirantis.com> Fri, 10 Aug 2018 15:42:34 +0400
+
+salt-formula-glance (2016.12.1-2xenial1) xenial; urgency=medium
+
+ * Fix files/pike symlink
+
+ -- devops <devops@mirantis.com> Tue, 06 Feb 2018 15:40:55 +0200
+
+salt-formula-glance (2016.12.1-1xenial1) xenial; urgency=medium
+
+ * Build for Ubuntu xenial
+
+ -- Filip Pytloun <filip@pytloun.cz> Tue, 24 Jan 2017 12:21:42 +0100
+
+salt-formula-glance (2016.12.1-1) unstable; urgency=medium
+
+ * New upstream release
+ * d/{control,copyright}: Use my @debian.org email address
+ * Bumped debhelper version to 10
+
+ -- OndÅ™ej Nový <onovy@debian.org> Sun, 25 Dec 2016 17:05:47 +0100
+
+salt-formula-glance (2016.4.1-3) unstable; urgency=medium
+
+ * Added Debian tests
+
+ -- OndÅ™ej Nový <novy@ondrej.org> Wed, 08 Jun 2016 21:27:16 +0200
+
+salt-formula-glance (2016.4.1-2) unstable; urgency=medium
+
+ * d/copyright: Added myself to Debian part
+ * Added myself as uploader
+
+ -- OndÅ™ej Nový <novy@ondrej.org> Wed, 11 May 2016 23:44:35 +0200
+
+salt-formula-glance (2016.4.1-1) unstable; urgency=medium
+
+ * Initial release (Closes: #821916)
+
+ -- Filip Pytloun <filip@pytloun.cz> Wed, 20 Apr 2016 16:04:29 +0200
diff --git a/debian/compat b/debian/compat
new file mode 100644
index 0000000..ec63514
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1 @@
+9
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..d2dff78
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,25 @@
+Source: salt-formula-glance
+Maintainer: PKG OpenStack <openstack-devel@lists.alioth.debian.org>
+Uploaders: Filip Pytloun <filip@pytloun.cz>,
+ OndÅ™ej Nový <onovy@debian.org>,
+Section: admin
+Priority: extra
+Build-Depends: debhelper (>= 9),
+ openstack-pkg-tools,
+Build-Depends-Indep: python-all,
+ python-yaml,
+ salt-formula-keystone,
+Standards-Version: 3.9.6
+Homepage: https://wiki.openstack.org/wiki/OpenStackSalt
+Vcs-Browser: https://anonscm.debian.org/cgit/openstack/salt-formula-glance.git/
+Vcs-Git: https://anonscm.debian.org/git/openstack/salt-formula-glance.git
+
+Package: salt-formula-glance
+Architecture: all
+Depends: ${misc:Depends},
+Description: Salt formula for OpenStack Glance
+ Salt is a powerful remote execution manager that can be used to
+ administer servers in a fast and efficient way.
+ .
+ This SaltStack formula manages both installation and configuration of
+ OpenStack Glance.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 0000000..269c2fd
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,28 @@
+Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: salt-formula-glance
+Source: https://github.com/openstack/salt-formula-glance
+
+Files: *
+Copyright: 2014-2016 tcp cloud
+License: Apache-2.0
+
+Files: debian/*
+Copyright: (c) 2016, Filip Pytloun <filip@pytloun.cz>
+ (c) 2016, OndÅ™ej Nový <onovy@debian.org>
+License: Apache-2.0
+
+License: Apache-2.0
+ 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.
+ .
+ On Debian-based systems the full text of the Apache version 2.0 license
+ can be found in `/usr/share/common-licenses/Apache-2.0'.
diff --git a/debian/docs b/debian/docs
new file mode 100644
index 0000000..a1320b1
--- /dev/null
+++ b/debian/docs
@@ -0,0 +1 @@
+README.rst
diff --git a/debian/gbp.conf b/debian/gbp.conf
new file mode 100644
index 0000000..d6f9d4f
--- /dev/null
+++ b/debian/gbp.conf
@@ -0,0 +1,8 @@
+[DEFAULT]
+upstream-branch = master
+debian-branch = debian/xenial
+upstream-tag = %(version)s
+compression = xz
+
+[buildpackage]
+export-dir = ../build-area/
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..f7d5908
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,7 @@
+#!/usr/bin/make -f
+
+include /usr/share/openstack-pkg-tools/pkgos.make
+
+%:
+ dh $@
+
diff --git a/debian/salt-formula-glance.postinst b/debian/salt-formula-glance.postinst
new file mode 100644
index 0000000..eaf2500
--- /dev/null
+++ b/debian/salt-formula-glance.postinst
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+set -e
+
+dpkg-maintscript-helper symlink_to_dir \
+ /usr/share/salt-formulas/env/glance/files/pike /usr/share/salt-formulas/env/glance/files/ocata salt-formula-glance -- "$@"
+
+#DEBHELPER#
+
+exit 0
diff --git a/debian/salt-formula-glance.postrm b/debian/salt-formula-glance.postrm
new file mode 100644
index 0000000..eaf2500
--- /dev/null
+++ b/debian/salt-formula-glance.postrm
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+set -e
+
+dpkg-maintscript-helper symlink_to_dir \
+ /usr/share/salt-formulas/env/glance/files/pike /usr/share/salt-formulas/env/glance/files/ocata salt-formula-glance -- "$@"
+
+#DEBHELPER#
+
+exit 0
diff --git a/debian/salt-formula-glance.preinst b/debian/salt-formula-glance.preinst
new file mode 100644
index 0000000..eaf2500
--- /dev/null
+++ b/debian/salt-formula-glance.preinst
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+set -e
+
+dpkg-maintscript-helper symlink_to_dir \
+ /usr/share/salt-formulas/env/glance/files/pike /usr/share/salt-formulas/env/glance/files/ocata salt-formula-glance -- "$@"
+
+#DEBHELPER#
+
+exit 0
diff --git a/debian/source/format b/debian/source/format
new file mode 100644
index 0000000..89ae9db
--- /dev/null
+++ b/debian/source/format
@@ -0,0 +1 @@
+3.0 (native)
diff --git a/debian/tests/control b/debian/tests/control
new file mode 100644
index 0000000..685e62b
--- /dev/null
+++ b/debian/tests/control
@@ -0,0 +1,2 @@
+Test-Command: cd tests && ./run_tests.sh
+Restrictions: allow-stderr
diff --git a/debian/watch b/debian/watch
new file mode 100644
index 0000000..673a9ef
--- /dev/null
+++ b/debian/watch
@@ -0,0 +1,3 @@
+version=3
+opts="uversionmangle=s/\.(b|rc)/~$1/" \
+https://github.com/openstack/salt-formula-glance/tags .*/(\d[\d\.]+)\.tar\.gz
diff --git a/glance/client.sls b/glance/client.sls
index 3f45edb..8904b65 100644
--- a/glance/client.sls
+++ b/glance/client.sls
@@ -5,9 +5,43 @@
pkg.installed:
- names: {{ client.pkgs }}
-{%- for identity_name, identity in client.identity.iteritems() %}
+{%- if client.cloud_name is defined %}
-{%- for image_name, image in identity.image.iteritems() %}
+{%- for identity_name, identity in client.identity.items() %}
+{%- for image_name, image in identity.image.items() %}
+
+{%- set _image_properties = {} %}
+{%- do _image_properties.update({'container_format': image.container_format}) %}
+{%- do _image_properties.update({'disk_format': image.disk_format}) %}
+{%- do _image_properties.update({'protected': 'false'}) %}
+{%- do _image_properties.update({'tags': image.tags}) %}
+{%- do _image_properties.update({'visibility': image.visibility}) %}
+
+glance_openstack_image_{{ image_name }}:
+ glancev2.image_present:
+ - cloud_name: {{ client.cloud_name }}
+ - name: {{ image.get('name', image_name) }}
+ - image_properties: {{ _image_properties }}
+ {%- if image.import_from_format is defined %}
+ - import_from_format: {{ image.import_from_format }}
+ {%- endif %}
+ {%- if image.location is defined %}
+ - location: {{ image.location }}
+ {%- endif %}
+ {%- if image.wait_timeout is defined %}
+ - timeout: {{ image.wait_timeout }}
+ {%- endif %}
+ {%- if image.checksum is defined %}
+ - checksum: {{ image.checksum }}
+ {%- endif %}
+{%- endfor %}
+{%- endfor %}
+
+
+{%- else %}
+{%- for identity_name, identity in client.identity.items() %}
+
+{%- for image_name, image in identity.image.items() %}
glance_openstack_image_{{ image_name }}:
glanceng.image_import:
@@ -44,4 +78,6 @@
{%- endfor %}
{%- endfor %}
-{%- endif %}
\ No newline at end of file
+{%- endif %}
+
+{%- endif %}
diff --git a/glance/db/offline_sync.sls b/glance/db/offline_sync.sls
new file mode 100644
index 0000000..d93f2da
--- /dev/null
+++ b/glance/db/offline_sync.sls
@@ -0,0 +1,17 @@
+{%- from "glance/map.jinja" import server with context %}
+
+glance_syncdb:
+ cmd.run:
+ - name: glance-manage db_sync
+ {%- if grains.get('noservices') or server.get('role', 'primary') == 'secondary' %}
+ - onlyif: /bin/false
+ {%- endif %}
+
+glance_load_metadatafs:
+ cmd.run:
+ - name: glance-manage db_load_metadefs
+ - require:
+ - cmd: glance_syncdb
+ {%- if grains.get('noservices') or server.get('role', 'primary') == 'secondary' %}
+ - onlyif: /bin/false
+ {%- endif %}
diff --git a/glance/files/_backends/_swift.conf b/glance/files/_backends/_swift.conf
index 2b34391..238b4d4 100644
--- a/glance/files/_backends/_swift.conf
+++ b/glance/files/_backends/_swift.conf
@@ -1,6 +1,6 @@
{%- from "glance/map.jinja" import server with context %}
-{% for reference_key, reference in server.storage.get('swift', {}).get('store', {}).get('references', {}).iteritems() %}
+{% for reference_key, reference in server.storage.get('swift', {}).get('store', {}).get('references', {}).items() %}
[{{ reference_key }}]
# A project_name user_name pair in the project_name:user_name format to authenticate against the Swift authentication service.
user = {{ reference.user }}
diff --git a/glance/files/default b/glance/files/default
index 7c2d52e..2acfbad 100644
--- a/glance/files/default
+++ b/glance/files/default
@@ -1,4 +1,4 @@
# Generated by Salt.
{% if values.logging.log_appender %}
-DAEMON_ARGS="--log-config-append=/etc/glance/logging/logging-{{ service_name }}.conf"
+DAEMON_ARGS="${DAEMON_ARGS} --log-config-append=/etc/glance/logging/logging-{{ service_name }}.conf"
{% endif %}
diff --git a/glance/files/grafana_dashboards/glance_prometheus.json b/glance/files/grafana_dashboards/glance_prometheus.json
index fe3ad38..0ff8930 100755
--- a/glance/files/grafana_dashboards/glance_prometheus.json
+++ b/glance/files/grafana_dashboards/glance_prometheus.json
@@ -1461,7 +1461,7 @@
"sharedCrosshair": true,
"style": "dark",
"tags": [
- "glance"
+ "openstack"
],
"templating": {
"list": [
diff --git a/glance/files/grafana_dashboards/glance_prometheus_fluentd.json b/glance/files/grafana_dashboards/glance_prometheus_fluentd.json
index b37cc23..2dd3609 100755
--- a/glance/files/grafana_dashboards/glance_prometheus_fluentd.json
+++ b/glance/files/grafana_dashboards/glance_prometheus_fluentd.json
@@ -1,1473 +1,2039 @@
-{% raw %}
+{%- raw %}
{
"annotations": {
- "list": []
+ "list": [
+ {
+ "$$hashKey": "object:25672",
+ "builtIn": 1,
+ "datasource": "prometheus",
+ "enable": true,
+ "hide": true,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "limit": 100,
+ "name": "Annotations & Alerts",
+ "showIn": 0,
+ "type": "dashboard"
+ }
+ ]
},
- "description": "Monitors Glance cluster using Prometheus. Shows overall cluster processes and usage.",
"editable": true,
- "gnetId": 315,
- "graphTooltip": 1,
- "hideControls": false,
+ "gnetId": null,
+ "graphTooltip": 0,
"id": null,
+ "iteration": 1529667333842,
"links": [],
- "refresh": "1m",
- "rows": [
+ "panels": [
{
- "collapse": false,
- "height": "250px",
- "panels": [
- {
- "cacheTimeout": null,
- "colorBackground": false,
- "colorValue": true,
- "colors": [
- "rgba(245, 54, 54, 0.9)",
- "rgba(50, 172, 45, 0.97)",
- "rgba(237, 129, 40, 0.89)"
- ],
- "datasource": "prometheus",
- "format": "none",
- "gauge": {
- "maxValue": 1,
- "minValue": 0,
- "show": false,
- "thresholdLabels": false,
- "thresholdMarkers": true
- },
- "id": 1,
- "interval": null,
- "links": [],
- "mappingType": 1,
- "mappingTypes": [
- {
- "name": "value to text",
- "value": 1
- },
- {
- "name": "range to text",
- "value": 2
- }
- ],
- "maxDataPoints": 100,
- "nullPointMode": "connected",
- "nullText": null,
- "postfix": "",
- "postfixFontSize": "50%",
- "prefix": "",
- "prefixFontSize": "50%",
- "rangeMaps": [
- {
- "from": "null",
- "text": "N/A",
- "to": "null"
- }
- ],
- "span": 3,
- "sparkline": {
- "fillColor": "rgba(31, 118, 189, 0.18)",
- "full": false,
- "lineColor": "rgb(31, 120, 193)",
- "show": true
- },
- "tableColumn": "",
- "targets": [
- {
- "expr": "min(openstack_api_check_status{service=~\"glance.*\"})",
- "format": "time_series",
- "intervalFactor": 2,
- "legendFormat": "{{ service }}",
- "refId": "A",
- "step": 60
- }
- ],
- "thresholds": "0.5,1.5",
- "title": "API Availability",
- "type": "singlestat",
- "valueFontSize": "80%",
- "valueMaps": [
- {
- "op": "=",
- "text": "N/A",
- "value": "null"
- },
- {
- "op": "=",
- "text": "DOWN",
- "value": "0"
- },
- {
- "op": "=",
- "text": "OK",
- "value": "1"
- },
- {
- "op": "=",
- "text": "UNKNOWN",
- "value": "2"
- }
- ],
- "valueName": "current"
- },
- {
- "cacheTimeout": null,
- "colorBackground": false,
- "colorValue": false,
- "colors": [
- "rgba(245, 54, 54, 0.9)",
- "rgba(237, 129, 40, 0.89)",
- "rgba(50, 172, 45, 0.97)"
- ],
- "datasource": "prometheus",
- "decimals": null,
- "format": "none",
- "gauge": {
- "maxValue": 100,
- "minValue": 0,
- "show": false,
- "thresholdLabels": false,
- "thresholdMarkers": true
- },
- "id": 2,
- "interval": null,
- "links": [],
- "mappingType": 1,
- "mappingTypes": [
- {
- "name": "value to text",
- "value": 1
- },
- {
- "name": "range to text",
- "value": 2
- }
- ],
- "maxDataPoints": 100,
- "nullPointMode": "connected",
- "nullText": null,
- "postfix": "/ sec",
- "postfixFontSize": "50%",
- "prefix": "",
- "prefixFontSize": "50%",
- "rangeMaps": [
- {
- "from": "null",
- "text": "N/A",
- "to": "null"
- }
- ],
- "span": 3,
- "sparkline": {
- "fillColor": "rgba(31, 118, 189, 0.18)",
- "full": false,
- "lineColor": "rgb(31, 120, 193)",
- "show": true
- },
- "tableColumn": "",
- "targets": [
- {
- "expr": "sum(irate(haproxy_http_response_5xx{proxy=~\"glance.*\",sv=\"FRONTEND\"}[5m]))",
- "format": "time_series",
- "intervalFactor": 2,
- "legendFormat": "per sec",
- "refId": "A",
- "step": 60
- }
- ],
- "thresholds": "",
- "title": "HTTP 5xx errors",
- "type": "singlestat",
- "valueFontSize": "80%",
- "valueMaps": [
- {
- "op": "=",
- "text": "N/A",
- "value": "null"
- }
- ],
- "valueName": "current"
- },
- {
- "cacheTimeout": null,
- "colorBackground": false,
- "colorValue": false,
- "colors": [
- "rgba(245, 54, 54, 0.9)",
- "rgba(237, 129, 40, 0.89)",
- "rgba(50, 172, 45, 0.97)"
- ],
- "datasource": "prometheus",
- "format": "none",
- "gauge": {
- "maxValue": 100,
- "minValue": 0,
- "show": false,
- "thresholdLabels": false,
- "thresholdMarkers": true
- },
- "id": 4,
- "interval": null,
- "links": [],
- "mappingType": 1,
- "mappingTypes": [
- {
- "name": "value to text",
- "value": 1
- },
- {
- "name": "range to text",
- "value": 2
- }
- ],
- "maxDataPoints": 100,
- "nullPointMode": "connected",
- "nullText": null,
- "postfix": "",
- "postfixFontSize": "50%",
- "prefix": "",
- "prefixFontSize": "50%",
- "rangeMaps": [
- {
- "from": "null",
- "text": "N/A",
- "to": "null"
- }
- ],
- "span": 3,
- "sparkline": {
- "fillColor": "rgba(31, 118, 189, 0.18)",
- "full": false,
- "lineColor": "rgb(31, 120, 193)",
- "show": true
- },
- "tableColumn": "",
- "targets": [
- {
- "expr": "min(haproxy_active_servers{proxy=~\"glance.api\", sv=\"BACKEND\"})",
- "format": "time_series",
- "intervalFactor": 2,
- "legendFormat": "",
- "refId": "A",
- "step": 60
- }
- ],
- "thresholds": "",
- "title": "Glance API backends",
- "type": "singlestat",
- "valueFontSize": "80%",
- "valueMaps": [
- {
- "op": "=",
- "text": "N/A",
- "value": "null"
- }
- ],
- "valueName": "current"
- },
- {
- "cacheTimeout": null,
- "colorBackground": false,
- "colorValue": false,
- "colors": [
- "rgba(245, 54, 54, 0.9)",
- "rgba(237, 129, 40, 0.89)",
- "rgba(50, 172, 45, 0.97)"
- ],
- "datasource": "prometheus",
- "format": "none",
- "gauge": {
- "maxValue": 100,
- "minValue": 0,
- "show": false,
- "thresholdLabels": false,
- "thresholdMarkers": true
- },
- "id": 5,
- "interval": null,
- "links": [],
- "mappingType": 1,
- "mappingTypes": [
- {
- "name": "value to text",
- "value": 1
- },
- {
- "name": "range to text",
- "value": 2
- }
- ],
- "maxDataPoints": 100,
- "nullPointMode": "connected",
- "nullText": null,
- "postfix": "",
- "postfixFontSize": "50%",
- "prefix": "",
- "prefixFontSize": "50%",
- "rangeMaps": [
- {
- "from": "null",
- "text": "N/A",
- "to": "null"
- }
- ],
- "span": 3,
- "sparkline": {
- "fillColor": "rgba(31, 118, 189, 0.18)",
- "full": false,
- "lineColor": "rgb(31, 120, 193)",
- "show": true
- },
- "tableColumn": "",
- "targets": [
- {
- "expr": "min(haproxy_active_servers{proxy=~\"glance.*registry.*\", sv=\"BACKEND\"})",
- "format": "time_series",
- "intervalFactor": 2,
- "legendFormat": "",
- "refId": "A",
- "step": 60
- }
- ],
- "thresholds": "",
- "title": "Glance Registry backends",
- "type": "singlestat",
- "valueFontSize": "80%",
- "valueMaps": [
- {
- "op": "=",
- "text": "N/A",
- "value": "null"
- }
- ],
- "valueName": "current"
- }
- ],
- "repeat": null,
- "repeatIteration": null,
- "repeatRowId": null,
- "showTitle": true,
- "title": "Service Status",
- "titleSize": "h6"
+ "collapsed": false,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 0
+ },
+ "id": 6,
+ "panels": [],
+ "title": "Cluster Status",
+ "type": "row"
},
{
- "collapse": false,
- "height": "250",
- "panels": [
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#299c46"
+ ],
+ "datasource": null,
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 4,
+ "x": 0,
+ "y": 1
+ },
+ "id": 9,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
{
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "datasource": "prometheus",
- "fill": 1,
- "id": 19,
- "legend": {
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "show": true,
- "total": false,
- "values": false
- },
- "lines": true,
- "linewidth": 1,
- "links": [],
- "nullPointMode": "null",
- "percentage": false,
- "pointradius": 5,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "span": 6,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "expr": "sum(rate(openstack_http_response_times_count{service=\"glance\",host=~\"^$host$\"}[5m])) by (http_status)",
- "format": "time_series",
- "intervalFactor": 2,
- "legendFormat": "{{ http_status }}",
- "refId": "A",
- "step": 10
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeShift": null,
- "title": "Throughput",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "ops",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": "0",
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- }
- ]
+ "name": "value to text",
+ "value": 1
},
{
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "datasource": "prometheus",
- "fill": 1,
- "id": 20,
- "legend": {
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "show": true,
- "total": false,
- "values": false
- },
- "lines": true,
- "linewidth": 1,
- "links": [],
- "nullPointMode": "null",
- "percentage": false,
- "pointradius": 5,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "span": 6,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "expr": "max(openstack_http_response_times{service='glance',quantile='0.9',host=~'^$host$'}) by (http_method)",
- "format": "time_series",
- "intervalFactor": 2,
- "legendFormat": "{{ http_method }}",
- "refId": "A",
- "step": 10
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeShift": null,
- "title": "Latency",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "s",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": "0",
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- }
- ]
+ "name": "range to text",
+ "value": 2
}
],
- "repeat": null,
- "repeatIteration": null,
- "repeatRowId": null,
- "showTitle": true,
- "title": "API Performances",
- "titleSize": "h6"
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "80%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "min(openstack_api_check_status{name=\"glance\"})",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0.5,0.5",
+ "title": "VIP API availability",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ },
+ {
+ "op": "=",
+ "text": "FAIL",
+ "value": "0"
+ },
+ {
+ "op": "=",
+ "text": "OK",
+ "value": "1"
+ }
+ ],
+ "valueName": "avg"
},
{
- "collapse": false,
- "height": "250px",
- "panels": [
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#299c46"
+ ],
+ "datasource": null,
+ "format": "percentunit",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 4,
+ "x": 4,
+ "y": 1
+ },
+ "id": 8,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
{
- "cacheTimeout": null,
- "colorBackground": false,
- "colorValue": false,
- "colors": [
- "rgba(245, 54, 54, 0.9)",
- "rgba(237, 129, 40, 0.89)",
- "rgba(50, 172, 45, 0.97)"
- ],
- "datasource": "prometheus",
- "decimals": 0,
- "format": "none",
- "gauge": {
- "maxValue": 100,
- "minValue": 0,
- "show": false,
- "thresholdLabels": false,
- "thresholdMarkers": true
- },
- "id": 7,
- "interval": null,
- "links": [],
- "mappingType": 1,
- "mappingTypes": [
- {
- "name": "value to text",
- "value": 1
- },
- {
- "name": "range to text",
- "value": 2
- }
- ],
- "maxDataPoints": 100,
- "nullPointMode": "connected",
- "nullText": null,
- "postfix": "",
- "postfixFontSize": "50%",
- "prefix": "",
- "prefixFontSize": "50%",
- "rangeMaps": [
- {
- "from": "null",
- "text": "N/A",
- "to": "null"
- }
- ],
- "span": 2,
- "sparkline": {
- "fillColor": "rgba(31, 118, 189, 0.18)",
- "full": false,
- "lineColor": "rgb(31, 120, 193)",
- "show": false
- },
- "tableColumn": "",
- "targets": [
- {
- "expr": "max(openstack_glance_images{status=\"active\",visibility=\"public\"})",
- "format": "time_series",
- "intervalFactor": 2,
- "legendFormat": "",
- "refId": "A",
- "step": 60
- }
- ],
- "thresholds": "",
- "title": "Public Images",
- "type": "singlestat",
- "valueFontSize": "80%",
- "valueMaps": [
- {
- "op": "=",
- "text": "N/A",
- "value": "null"
- }
- ],
- "valueName": "current"
+ "name": "value to text",
+ "value": 1
},
{
- "cacheTimeout": null,
- "colorBackground": false,
- "colorValue": false,
- "colors": [
- "rgba(245, 54, 54, 0.9)",
- "rgba(237, 129, 40, 0.89)",
- "rgba(50, 172, 45, 0.97)"
- ],
- "datasource": "prometheus",
- "decimals": 0,
- "format": "none",
- "gauge": {
- "maxValue": 100,
- "minValue": 0,
- "show": false,
- "thresholdLabels": false,
- "thresholdMarkers": true
- },
- "id": 8,
- "interval": null,
- "links": [],
- "mappingType": 1,
- "mappingTypes": [
- {
- "name": "value to text",
- "value": 1
- },
- {
- "name": "range to text",
- "value": 2
- }
- ],
- "maxDataPoints": 100,
- "nullPointMode": "connected",
- "nullText": null,
- "postfix": "",
- "postfixFontSize": "50%",
- "prefix": "",
- "prefixFontSize": "50%",
- "rangeMaps": [
- {
- "from": "null",
- "text": "N/A",
- "to": "null"
- }
- ],
- "span": 2,
- "sparkline": {
- "fillColor": "rgba(31, 118, 189, 0.18)",
- "full": false,
- "lineColor": "rgb(31, 120, 193)",
- "show": false
- },
- "tableColumn": "",
- "targets": [
- {
- "expr": "max(openstack_glance_images{status=\"active\",visibility=\"private\"})",
- "format": "time_series",
- "intervalFactor": 2,
- "legendFormat": "",
- "refId": "A",
- "step": 60
- }
- ],
- "thresholds": "",
- "title": "Private Images",
- "type": "singlestat",
- "valueFontSize": "80%",
- "valueMaps": [
- {
- "op": "=",
- "text": "N/A",
- "value": "null"
- }
- ],
- "valueName": "current"
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": " UP",
+ "postfixFontSize": "80%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(http_response_status{name=\"glance-api\"}) / count(http_response_status{name=\"glance-api\"})",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0.3,0.6",
+ "title": "Hosts Glance APIs availability",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "avg"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#299c46"
+ ],
+ "datasource": null,
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 5,
+ "x": 8,
+ "y": 1
+ },
+ "id": 14,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
},
{
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "datasource": "prometheus",
- "decimals": 0,
- "fill": 1,
- "id": 9,
- "legend": {
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "show": true,
- "total": false,
- "values": false
- },
- "lines": true,
- "linewidth": 1,
- "links": [],
- "nullPointMode": "null",
- "percentage": false,
- "pointradius": 5,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "span": 8,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "expr": "max(openstack_glance_images{status=\"active\"}) by (visibility)",
- "format": "time_series",
- "intervalFactor": 2,
- "legendFormat": "{{ visibility }}",
- "refId": "A",
- "step": 4
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeShift": null,
- "title": "Number of images",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": "0",
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- }
- ]
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "80%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "min(haproxy_active_servers{proxy=\"glance_api\", sv=\"BACKEND\"})",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0.35,0.7",
+ "title": "Haproxy Glance API backends",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "avg"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#299c46"
+ ],
+ "datasource": null,
+ "format": "percentunit",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 5,
+ "x": 13,
+ "y": 1
+ },
+ "id": 29,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
},
{
- "cacheTimeout": null,
- "colorBackground": false,
- "colorValue": false,
- "colors": [
- "rgba(245, 54, 54, 0.9)",
- "rgba(237, 129, 40, 0.89)",
- "rgba(50, 172, 45, 0.97)"
- ],
- "datasource": "prometheus",
- "decimals": 2,
- "format": "decbits",
- "gauge": {
- "maxValue": 100,
- "minValue": 0,
- "show": false,
- "thresholdLabels": false,
- "thresholdMarkers": true
- },
- "id": 10,
- "interval": null,
- "links": [],
- "mappingType": 1,
- "mappingTypes": [
- {
- "name": "value to text",
- "value": 1
- },
- {
- "name": "range to text",
- "value": 2
- }
- ],
- "maxDataPoints": 100,
- "nullPointMode": "connected",
- "nullText": null,
- "postfix": "",
- "postfixFontSize": "50%",
- "prefix": "",
- "prefixFontSize": "50%",
- "rangeMaps": [
- {
- "from": "null",
- "text": "N/A",
- "to": "null"
- }
- ],
- "span": 2,
- "sparkline": {
- "fillColor": "rgba(31, 118, 189, 0.18)",
- "full": false,
- "lineColor": "rgb(31, 120, 193)",
- "show": false
- },
- "tableColumn": "",
- "targets": [
- {
- "expr": "max(openstack_glance_images_size{status=\"active\",visibility=\"public\"})",
- "format": "time_series",
- "intervalFactor": 2,
- "legendFormat": "",
- "refId": "A",
- "step": 60
- }
- ],
- "thresholds": "",
- "title": "Public Images Size",
- "type": "singlestat",
- "valueFontSize": "80%",
- "valueMaps": [
- {
- "op": "=",
- "text": "N/A",
- "value": "null"
- }
- ],
- "valueName": "current"
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": " UP",
+ "postfixFontSize": "80%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "$$hashKey": "object:25928",
+ "expr": "sum(http_response_status{name=\"glance-registry\"}) / count(http_response_status{name=\"glance-registry\"})",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0.3,0.6",
+ "title": "Hosts Glance Registry APIs availability",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "avg"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#299c46"
+ ],
+ "datasource": null,
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 6,
+ "x": 18,
+ "y": 1
+ },
+ "id": 30,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
},
{
- "cacheTimeout": null,
- "colorBackground": false,
- "colorValue": false,
- "colors": [
- "rgba(245, 54, 54, 0.9)",
- "rgba(237, 129, 40, 0.89)",
- "rgba(50, 172, 45, 0.97)"
- ],
- "datasource": "prometheus",
- "decimals": 2,
- "format": "decbits",
- "gauge": {
- "maxValue": 100,
- "minValue": 0,
- "show": false,
- "thresholdLabels": false,
- "thresholdMarkers": true
- },
- "id": 11,
- "interval": null,
- "links": [],
- "mappingType": 1,
- "mappingTypes": [
- {
- "name": "value to text",
- "value": 1
- },
- {
- "name": "range to text",
- "value": 2
- }
- ],
- "maxDataPoints": 100,
- "nullPointMode": "connected",
- "nullText": null,
- "postfix": "",
- "postfixFontSize": "50%",
- "prefix": "",
- "prefixFontSize": "50%",
- "rangeMaps": [
- {
- "from": "null",
- "text": "N/A",
- "to": "null"
- }
- ],
- "span": 2,
- "sparkline": {
- "fillColor": "rgba(31, 118, 189, 0.18)",
- "full": false,
- "lineColor": "rgb(31, 120, 193)",
- "show": false
- },
- "tableColumn": "",
- "targets": [
- {
- "expr": "max(openstack_glance_images_size{status=\"active\",visibility=\"private\"})",
- "format": "time_series",
- "intervalFactor": 2,
- "legendFormat": "",
- "refId": "A",
- "step": 60
- }
- ],
- "thresholds": "",
- "title": "Private Images Size",
- "type": "singlestat",
- "valueFontSize": "80%",
- "valueMaps": [
- {
- "op": "=",
- "text": "N/A",
- "value": "null"
- }
- ],
- "valueName": "current"
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "80%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "min(haproxy_active_servers{proxy=\"glance_registry_api\", sv=\"BACKEND\"})",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0.35,0.7",
+ "title": "Haproxy Glance Registry API backends",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "avg"
+ },
+ {
+ "collapsed": false,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 6
+ },
+ "id": 39,
+ "panels": [],
+ "title": "Host API Status",
+ "type": "row"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": true,
+ "colorValue": false,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#299c46"
+ ],
+ "datasource": null,
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 2,
+ "w": 8,
+ "x": 0,
+ "y": 7
+ },
+ "id": 41,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "$$hashKey": "object:25831",
+ "name": "value to text",
+ "value": 1
},
{
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "datasource": "prometheus",
- "decimals": 2,
- "fill": 1,
- "id": 12,
- "legend": {
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "show": true,
- "total": false,
- "values": false
- },
- "lines": true,
- "linewidth": 1,
- "links": [],
- "nullPointMode": "null",
- "percentage": false,
- "pointradius": 5,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "span": 8,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "expr": "max(openstack_glance_images_size{status=\"active\"}) by (visibility)",
- "format": "time_series",
- "intervalFactor": 2,
- "legendFormat": "{{ visibility }}",
- "refId": "A",
- "step": 4
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeShift": null,
- "title": "Images size",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "decbits",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": "0",
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- }
- ]
+ "$$hashKey": "object:25832",
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "repeat": "host",
+ "repeatDirection": "h",
+ "scopedVars": {
+ "host": {
+ "$$hashKey": "object:25889",
+ "selected": false,
+ "text": "ctl01",
+ "value": "ctl01"
+ }
+ },
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "$$hashKey": "object:25779",
+ "expr": "http_response_status{host=~\"$host\",name=\"glance-api\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0.5,0.5",
+ "title": "Glance@$host",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "$$hashKey": "object:25834",
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
},
{
- "cacheTimeout": null,
- "colorBackground": false,
- "colorValue": false,
- "colors": [
- "rgba(245, 54, 54, 0.9)",
- "rgba(237, 129, 40, 0.89)",
- "rgba(50, 172, 45, 0.97)"
- ],
- "datasource": "prometheus",
- "decimals": 0,
- "format": "none",
- "gauge": {
- "maxValue": 100,
- "minValue": 0,
- "show": false,
- "thresholdLabels": false,
- "thresholdMarkers": true
- },
- "id": 13,
- "interval": null,
- "links": [],
- "mappingType": 1,
- "mappingTypes": [
- {
- "name": "value to text",
- "value": 1
- },
- {
- "name": "range to text",
- "value": 2
- }
- ],
- "maxDataPoints": 100,
- "nullPointMode": "connected",
- "nullText": null,
- "postfix": "",
- "postfixFontSize": "50%",
- "prefix": "",
- "prefixFontSize": "50%",
- "rangeMaps": [
- {
- "from": "null",
- "text": "N/A",
- "to": "null"
- }
- ],
- "span": 2,
- "sparkline": {
- "fillColor": "rgba(31, 118, 189, 0.18)",
- "full": false,
- "lineColor": "rgb(31, 120, 193)",
- "show": false
- },
- "tableColumn": "",
- "targets": [
- {
- "expr": "max(openstack_glance_snapshots{status=\"active\",visibility=\"public\"})",
- "format": "time_series",
- "intervalFactor": 2,
- "legendFormat": "",
- "refId": "A",
- "step": 60
- }
- ],
- "thresholds": "",
- "title": "Public Snapshots",
- "type": "singlestat",
- "valueFontSize": "80%",
- "valueMaps": [
- {
- "op": "=",
- "text": "N/A",
- "value": "null"
- }
- ],
- "valueName": "current"
+ "$$hashKey": "object:25835",
+ "op": "=",
+ "text": "FAIL",
+ "value": "0"
},
{
- "cacheTimeout": null,
- "colorBackground": false,
- "colorValue": false,
- "colors": [
- "rgba(245, 54, 54, 0.9)",
- "rgba(237, 129, 40, 0.89)",
- "rgba(50, 172, 45, 0.97)"
- ],
- "datasource": "prometheus",
- "decimals": 0,
- "format": "none",
- "gauge": {
- "maxValue": 100,
- "minValue": 0,
- "show": false,
- "thresholdLabels": false,
- "thresholdMarkers": true
- },
- "id": 14,
- "interval": null,
- "links": [],
- "mappingType": 1,
- "mappingTypes": [
- {
- "name": "value to text",
- "value": 1
- },
- {
- "name": "range to text",
- "value": 2
- }
- ],
- "maxDataPoints": 100,
- "nullPointMode": "connected",
- "nullText": null,
- "postfix": "",
- "postfixFontSize": "50%",
- "prefix": "",
- "prefixFontSize": "50%",
- "rangeMaps": [
- {
- "from": "null",
- "text": "N/A",
- "to": "null"
- }
- ],
- "span": 2,
- "sparkline": {
- "fillColor": "rgba(31, 118, 189, 0.18)",
- "full": false,
- "lineColor": "rgb(31, 120, 193)",
- "show": false
- },
- "tableColumn": "",
- "targets": [
- {
- "expr": "max(openstack_glance_snapshots{status=\"active\",visibility=\"private\"})",
- "format": "time_series",
- "intervalFactor": 2,
- "legendFormat": "",
- "refId": "A",
- "step": 60
- }
- ],
- "thresholds": "",
- "title": "Private Snapshots",
- "type": "singlestat",
- "valueFontSize": "80%",
- "valueMaps": [
- {
- "op": "=",
- "text": "N/A",
- "value": "null"
- }
- ],
- "valueName": "current"
+ "$$hashKey": "object:25836",
+ "op": "=",
+ "text": "OK",
+ "value": "1"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": true,
+ "colorValue": false,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#299c46"
+ ],
+ "datasource": null,
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 2,
+ "w": 8,
+ "x": 8,
+ "y": 7
+ },
+ "id": 43,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "$$hashKey": "object:25831",
+ "name": "value to text",
+ "value": 1
},
{
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "datasource": "prometheus",
- "decimals": 0,
- "fill": 1,
- "id": 15,
- "legend": {
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "show": true,
- "total": false,
- "values": false
- },
- "lines": true,
- "linewidth": 1,
- "links": [],
- "nullPointMode": "null",
- "percentage": false,
- "pointradius": 5,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "span": 8,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "expr": "max(openstack_glance_snapshots{status=\"active\"}) by (visibility)",
- "format": "time_series",
- "intervalFactor": 2,
- "legendFormat": "{{ visibility }}",
- "refId": "A",
- "step": 4
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeShift": null,
- "title": "Number of Snapshots",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": "0",
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- }
- ]
- },
+ "$$hashKey": "object:25832",
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
{
- "cacheTimeout": null,
- "colorBackground": false,
- "colorValue": false,
- "colors": [
- "rgba(245, 54, 54, 0.9)",
- "rgba(237, 129, 40, 0.89)",
- "rgba(50, 172, 45, 0.97)"
- ],
- "datasource": "prometheus",
- "decimals": 2,
- "format": "decbits",
- "gauge": {
- "maxValue": 100,
- "minValue": 0,
- "show": false,
- "thresholdLabels": false,
- "thresholdMarkers": true
- },
- "id": 16,
- "interval": null,
- "links": [],
- "mappingType": 1,
- "mappingTypes": [
- {
- "name": "value to text",
- "value": 1
- },
- {
- "name": "range to text",
- "value": 2
- }
- ],
- "maxDataPoints": 100,
- "nullPointMode": "connected",
- "nullText": null,
- "postfix": "",
- "postfixFontSize": "50%",
- "prefix": "",
- "prefixFontSize": "50%",
- "rangeMaps": [
- {
- "from": "null",
- "text": "N/A",
- "to": "null"
- }
- ],
- "span": 2,
- "sparkline": {
- "fillColor": "rgba(31, 118, 189, 0.18)",
- "full": false,
- "lineColor": "rgb(31, 120, 193)",
- "show": false
- },
- "tableColumn": "",
- "targets": [
- {
- "expr": "max(openstack_glance_snapshots_size{status=\"active\",visibility=\"public\"})",
- "format": "time_series",
- "intervalFactor": 2,
- "legendFormat": "",
- "refId": "A",
- "step": 60
- }
- ],
- "thresholds": "",
- "title": "Public Snapshots Size",
- "type": "singlestat",
- "valueFontSize": "80%",
- "valueMaps": [
- {
- "op": "=",
- "text": "N/A",
- "value": "null"
- }
- ],
- "valueName": "current"
- },
- {
- "cacheTimeout": null,
- "colorBackground": false,
- "colorValue": false,
- "colors": [
- "rgba(245, 54, 54, 0.9)",
- "rgba(237, 129, 40, 0.89)",
- "rgba(50, 172, 45, 0.97)"
- ],
- "datasource": "prometheus",
- "decimals": 2,
- "format": "decbits",
- "gauge": {
- "maxValue": 100,
- "minValue": 0,
- "show": false,
- "thresholdLabels": false,
- "thresholdMarkers": true
- },
- "id": 17,
- "interval": null,
- "links": [],
- "mappingType": 1,
- "mappingTypes": [
- {
- "name": "value to text",
- "value": 1
- },
- {
- "name": "range to text",
- "value": 2
- }
- ],
- "maxDataPoints": 100,
- "nullPointMode": "connected",
- "nullText": null,
- "postfix": "",
- "postfixFontSize": "50%",
- "prefix": "",
- "prefixFontSize": "50%",
- "rangeMaps": [
- {
- "from": "null",
- "text": "N/A",
- "to": "null"
- }
- ],
- "span": 2,
- "sparkline": {
- "fillColor": "rgba(31, 118, 189, 0.18)",
- "full": false,
- "lineColor": "rgb(31, 120, 193)",
- "show": false
- },
- "tableColumn": "",
- "targets": [
- {
- "expr": "max(openstack_glance_snapshots_size{status=\"active\",visibility=\"private\"})",
- "format": "time_series",
- "intervalFactor": 2,
- "legendFormat": "",
- "refId": "A",
- "step": 60
- }
- ],
- "thresholds": "",
- "title": "Private Snapshots Size",
- "type": "singlestat",
- "valueFontSize": "80%",
- "valueMaps": [
- {
- "op": "=",
- "text": "N/A",
- "value": "null"
- }
- ],
- "valueName": "current"
- },
- {
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "datasource": "prometheus",
- "decimals": 2,
- "fill": 1,
- "id": 18,
- "legend": {
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "show": true,
- "total": false,
- "values": false
- },
- "lines": true,
- "linewidth": 1,
- "links": [],
- "nullPointMode": "null",
- "percentage": false,
- "pointradius": 5,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "span": 8,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "expr": "max(openstack_glance_snapshots_size{status=\"active\"}) by (visibility)",
- "format": "time_series",
- "intervalFactor": 2,
- "legendFormat": "{{ visibility }}",
- "refId": "A",
- "step": 4
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeShift": null,
- "title": "Snapshots Size",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "decbits",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": "0",
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- }
- ]
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
}
],
"repeat": null,
- "repeatIteration": null,
- "repeatRowId": null,
- "showTitle": true,
+ "repeatDirection": "h",
+ "repeatIteration": 1529667333842,
+ "repeatPanelId": 41,
+ "scopedVars": {
+ "host": {
+ "$$hashKey": "object:25890",
+ "selected": false,
+ "text": "ctl02",
+ "value": "ctl02"
+ }
+ },
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "$$hashKey": "object:25779",
+ "expr": "http_response_status{host=~\"$host\",name=\"glance-api\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0.5,0.5",
+ "title": "Glance@$host",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "$$hashKey": "object:25834",
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ },
+ {
+ "$$hashKey": "object:25835",
+ "op": "=",
+ "text": "FAIL",
+ "value": "0"
+ },
+ {
+ "$$hashKey": "object:25836",
+ "op": "=",
+ "text": "OK",
+ "value": "1"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": true,
+ "colorValue": false,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#299c46"
+ ],
+ "datasource": null,
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 2,
+ "w": 8,
+ "x": 16,
+ "y": 7
+ },
+ "id": 44,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "$$hashKey": "object:25831",
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "$$hashKey": "object:25832",
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "repeat": null,
+ "repeatDirection": "h",
+ "repeatIteration": 1529667333842,
+ "repeatPanelId": 41,
+ "scopedVars": {
+ "host": {
+ "$$hashKey": "object:25891",
+ "selected": false,
+ "text": "ctl03",
+ "value": "ctl03"
+ }
+ },
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "$$hashKey": "object:25779",
+ "expr": "http_response_status{host=~\"$host\",name=\"glance-api\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0.5,0.5",
+ "title": "Glance@$host",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "$$hashKey": "object:25834",
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ },
+ {
+ "$$hashKey": "object:25835",
+ "op": "=",
+ "text": "FAIL",
+ "value": "0"
+ },
+ {
+ "$$hashKey": "object:25836",
+ "op": "=",
+ "text": "OK",
+ "value": "1"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": true,
+ "colorValue": false,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#299c46"
+ ],
+ "datasource": null,
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 2,
+ "w": 8,
+ "x": 0,
+ "y": 9
+ },
+ "id": 42,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "$$hashKey": "object:25831",
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "$$hashKey": "object:25832",
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "repeat": "host",
+ "repeatDirection": "h",
+ "scopedVars": {
+ "host": {
+ "$$hashKey": "object:25889",
+ "selected": false,
+ "text": "ctl01",
+ "value": "ctl01"
+ }
+ },
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "$$hashKey": "object:25779",
+ "expr": "http_response_status{host=~\"$host\",name=\"glance-registry\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0.5,0.5",
+ "title": "Glance Registry@$host",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "$$hashKey": "object:25834",
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ },
+ {
+ "$$hashKey": "object:25835",
+ "op": "=",
+ "text": "FAIL",
+ "value": "0"
+ },
+ {
+ "$$hashKey": "object:25836",
+ "op": "=",
+ "text": "OK",
+ "value": "1"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": true,
+ "colorValue": false,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#299c46"
+ ],
+ "datasource": null,
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 2,
+ "w": 8,
+ "x": 8,
+ "y": 9
+ },
+ "id": 45,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "$$hashKey": "object:25831",
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "$$hashKey": "object:25832",
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "repeat": null,
+ "repeatDirection": "h",
+ "repeatIteration": 1529667333842,
+ "repeatPanelId": 42,
+ "scopedVars": {
+ "host": {
+ "$$hashKey": "object:25890",
+ "selected": false,
+ "text": "ctl02",
+ "value": "ctl02"
+ }
+ },
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "$$hashKey": "object:25779",
+ "expr": "http_response_status{host=~\"$host\",name=\"glance-registry\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0.5,0.5",
+ "title": "Glance Registry@$host",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "$$hashKey": "object:25834",
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ },
+ {
+ "$$hashKey": "object:25835",
+ "op": "=",
+ "text": "FAIL",
+ "value": "0"
+ },
+ {
+ "$$hashKey": "object:25836",
+ "op": "=",
+ "text": "OK",
+ "value": "1"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": true,
+ "colorValue": false,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#299c46"
+ ],
+ "datasource": null,
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 2,
+ "w": 8,
+ "x": 16,
+ "y": 9
+ },
+ "id": 46,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "$$hashKey": "object:25831",
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "$$hashKey": "object:25832",
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "repeat": null,
+ "repeatDirection": "h",
+ "repeatIteration": 1529667333842,
+ "repeatPanelId": 42,
+ "scopedVars": {
+ "host": {
+ "$$hashKey": "object:25891",
+ "selected": false,
+ "text": "ctl03",
+ "value": "ctl03"
+ }
+ },
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "$$hashKey": "object:25779",
+ "expr": "http_response_status{host=~\"$host\",name=\"glance-registry\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0.5,0.5",
+ "title": "Glance Registry@$host",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "$$hashKey": "object:25834",
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ },
+ {
+ "$$hashKey": "object:25835",
+ "op": "=",
+ "text": "FAIL",
+ "value": "0"
+ },
+ {
+ "$$hashKey": "object:25836",
+ "op": "=",
+ "text": "OK",
+ "value": "1"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "collapsed": false,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 11
+ },
+ "id": 13,
+ "panels": [],
+ "repeat": null,
+ "title": "API Performance",
+ "type": "row"
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": null,
+ "decimals": null,
+ "fill": 1,
+ "gridPos": {
+ "h": 5,
+ "w": 12,
+ "x": 0,
+ "y": 12
+ },
+ "hideTimeOverride": false,
+ "id": 16,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": false,
+ "hideEmpty": false,
+ "hideZero": true,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "minSpan": null,
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "repeat": null,
+ "repeatDirection": "v",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "$$hashKey": "object:26204",
+ "expr": "sum(rate(openstack_http_response_times_count{service=\"glance\",host=~\"$host\"}[$rate_interval])) by (http_status)",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "{{ http_status }}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Throughput@$host",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "transparent": false,
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "$$hashKey": "object:26232",
+ "format": "ops",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "$$hashKey": "object:26233",
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": null,
+ "decimals": null,
+ "fill": 1,
+ "gridPos": {
+ "h": 5,
+ "w": 12,
+ "x": 12,
+ "y": 12
+ },
+ "id": 17,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": false,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "repeat": null,
+ "repeatDirection": "v",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "avg(openstack_http_response_times{service=\"glance\",quantile=\"0.9\",host=~\"^$host$\",http_status=~\"2..\"}) by (http_method)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{http_method}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Latency@$host",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "collapsed": false,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 17
+ },
+ "id": 21,
+ "panels": [],
"title": "Resources",
- "titleSize": "h6"
+ "type": "row"
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": null,
+ "fill": 1,
+ "gridPos": {
+ "h": 5,
+ "w": 12,
+ "x": 0,
+ "y": 18
+ },
+ "id": 23,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": false,
+ "hideZero": false,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(openstack_glance_images) by (status)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{status}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Images (by status)",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": null,
+ "fill": 1,
+ "gridPos": {
+ "h": 5,
+ "w": 12,
+ "x": 12,
+ "y": 18
+ },
+ "id": 32,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": false,
+ "hideZero": false,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(openstack_glance_images_size) by (status)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{status}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Images Size (by status)",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": null,
+ "fill": 1,
+ "gridPos": {
+ "h": 5,
+ "w": 12,
+ "x": 0,
+ "y": 23
+ },
+ "id": 31,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": false,
+ "hideZero": false,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(openstack_glance_images) by (visibility)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{visibility}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Images (by visibility)",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": null,
+ "fill": 1,
+ "gridPos": {
+ "h": 5,
+ "w": 12,
+ "x": 12,
+ "y": 23
+ },
+ "id": 33,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": false,
+ "hideZero": false,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(openstack_glance_images_size) by (visibility)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{visibility}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Images Size (by visibility)",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": null,
+ "fill": 1,
+ "gridPos": {
+ "h": 5,
+ "w": 12,
+ "x": 0,
+ "y": 28
+ },
+ "id": 34,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": false,
+ "hideZero": false,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "max(sum(openstack_glance_snapshots) by (instance,status)) by (status)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{status}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Snapshots (by status)",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": null,
+ "fill": 1,
+ "gridPos": {
+ "h": 5,
+ "w": 12,
+ "x": 12,
+ "y": 28
+ },
+ "id": 35,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": false,
+ "hideZero": false,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "max(sum(openstack_glance_snapshots_size) by (instance,status)) by (status)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{status}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Snapshots Size (by status)",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": null,
+ "fill": 1,
+ "gridPos": {
+ "h": 5,
+ "w": 12,
+ "x": 0,
+ "y": 33
+ },
+ "id": 36,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": false,
+ "hideZero": false,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "max(sum(openstack_glance_snapshots) by (instance,visibility)) by (visibility)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{visibility}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Snapshots (by visibility)",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": null,
+ "fill": 1,
+ "gridPos": {
+ "h": 5,
+ "w": 12,
+ "x": 12,
+ "y": 33
+ },
+ "id": 37,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": false,
+ "hideZero": false,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "max(sum(openstack_glance_snapshots_size) by (instance,visibility)) by (visibility)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{visibility}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Snapshots Size (by visibility)",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
}
],
- "schemaVersion": 14,
- "sharedCrosshair": true,
+ "refresh": "1m",
+ "schemaVersion": 16,
"style": "dark",
"tags": [
- "glance"
+ "openstack"
],
"templating": {
"list": [
{
"allValue": null,
- "current": {},
+ "current": {
+ "tags": [],
+ "text": "All",
+ "value": [
+ "$__all"
+ ]
+ },
"datasource": "prometheus",
"hide": 0,
"includeAll": true,
@@ -1475,9 +2041,8 @@
"multi": true,
"name": "host",
"options": [],
- "query": "label_values(openstack_http_response_times_count,host)",
+ "query": "label_values(openstack_http_response_times{service=\"glance\"},host)",
"refresh": 1,
- "refresh_on_load": true,
"regex": "",
"sort": 1,
"tagValuesQuery": "",
@@ -1485,6 +2050,48 @@
"tagsQuery": "",
"type": "query",
"useTags": false
+ },
+ {
+ "allValue": null,
+ "current": {
+ "tags": [],
+ "text": "3m",
+ "value": "3m"
+ },
+ "hide": 0,
+ "includeAll": false,
+ "label": null,
+ "multi": false,
+ "name": "rate_interval",
+ "options": [
+ {
+ "selected": false,
+ "text": "1m",
+ "value": "1m"
+ },
+ {
+ "selected": true,
+ "text": "3m",
+ "value": "3m"
+ },
+ {
+ "selected": false,
+ "text": "5m",
+ "value": "5m"
+ },
+ {
+ "selected": false,
+ "text": "10m",
+ "value": "10m"
+ },
+ {
+ "selected": false,
+ "text": "15m",
+ "value": "15m"
+ }
+ ],
+ "query": "1m,3m,5m,10m,15m",
+ "type": "custom"
}
]
},
@@ -1517,8 +2124,9 @@
"30d"
]
},
- "timezone": "browser",
+ "timezone": "",
"title": "Glance",
- "version": 3
+ "uid": null,
+ "version": 1
}
-{% endraw %}
+{%- endraw %}
diff --git a/glance/files/logging.conf b/glance/files/logging.conf
deleted file mode 100644
index bc81c09..0000000
--- a/glance/files/logging.conf
+++ /dev/null
@@ -1,77 +0,0 @@
-{%- set log_handlers = [] -%}
-{%- for log_handler_name, log_handler_attrs in values.logging.log_handlers.items() %}
- {%- if log_handler_attrs.get('enabled', False) %}
- {%- do log_handlers.append(log_handler_name) -%}
- {%- endif %}
-{%- endfor %}
-[loggers]
-keys = root, glance, eventletwsgi
-
-[handlers]
-keys = {{ log_handlers | join(", ") }}
-
-[formatters]
-keys = context, default, fluentd
-
-[logger_root]
-level = WARNING
-handlers = {{ log_handlers | join(", ") }}
-
-[logger_glance]
-level = INFO
-handlers = {{ log_handlers | join(", ") }}
-qualname = glance
-propagate = 0
-
-[logger_amqplib]
-level = WARNING
-handlers = {{ log_handlers | join(", ") }}
-qualname = amqplib
-
-[logger_sqlalchemy]
-level = WARNING
-handlers = {{ log_handlers | join(", ") }}
-qualname = sqlalchemy
-# "level = INFO" logs SQL queries.
-# "level = DEBUG" logs SQL queries and results.
-# "level = WARNING" logs neither. (Recommended for production systems.)
-
-[logger_boto]
-level = WARNING
-handlers = {{ log_handlers | join(", ") }}
-qualname = boto
-
-[logger_suds]
-level = INFO
-handlers = {{ log_handlers | join(", ") }}
-qualname = suds
-
-[logger_eventletwsgi]
-level = INFO
-handlers = {{ log_handlers | join(", ") }}
-qualname = eventlet.wsgi.server
-
-{%- if values.logging.log_handlers.get('fluentd', {}).get('enabled', False) %}
-[handler_fluentd]
-class = fluent.handler.FluentHandler
-args = ('openstack.{{ service_name | replace("-", ".") }}', 'localhost', 24224)
-formatter = fluentd
-{%- endif %}
-
-{%- if values.logging.log_handlers.watchedfile.enabled %}
-[handler_watchedfile]
-class = handlers.WatchedFileHandler
-args = ('/var/log/glance/{{ service_name }}.log',)
-formatter = context
-{%- endif %}
-
-[formatter_context]
-class = oslo_log.formatters.ContextFormatter
-
-[formatter_default]
-format = %(message)s
-
-{%- if values.logging.log_handlers.get('fluentd', {}).get('enabled', False) %}
-[formatter_fluentd]
-class = oslo_log.formatters.FluentFormatter
-{%- endif %}
diff --git a/glance/files/ocata/glance-api.conf.Debian b/glance/files/ocata/glance-api.conf.Debian
index f6230b6..978030b 100644
--- a/glance/files/ocata/glance-api.conf.Debian
+++ b/glance/files/ocata/glance-api.conf.Debian
@@ -2027,7 +2027,7 @@
default_store = file
stores = file,http
{%- else %}
-default_store = {{ storage_engines[0] }}
+default_store = {{ server.storage.get('default_store', storage_engines[0]) }}
stores = {{ server.storage.engine }}
{%- endif %}
#
diff --git a/glance/files/ocata/glance-glare.conf.Debian b/glance/files/ocata/glance-glare.conf.Debian
index c9e79d6..9a43951 100644
--- a/glance/files/ocata/glance-glare.conf.Debian
+++ b/glance/files/ocata/glance-glare.conf.Debian
@@ -692,7 +692,7 @@
default_store = file
stores = file,http
{%- else %}
-default_store = {{ storage_engines[0] }}
+default_store = {{ server.storage.get('default_store', storage_engines[0]) }}
stores = {{ server.storage.engine }}
{%- endif %}
#
diff --git a/glance/files/pike/glance-api.conf.Debian b/glance/files/pike/glance-api.conf.Debian
index a29833a..bbe0dc0 100644
--- a/glance/files/pike/glance-api.conf.Debian
+++ b/glance/files/pike/glance-api.conf.Debian
@@ -2023,13 +2023,18 @@
#
# (list value)
#stores = file,http
+{%- if server.storage.default_store is defined %}
+default_store = {{ server.storage.default_store }}
+{%- endif %}
{%- if 'file' in storage_engines %}
-default_store = file
stores = file,http
{%- else %}
+ {%- if server.storage.default_store is not defined %}
default_store = {{ storage_engines[0] }}
+ {%- endif %}
stores = {{ server.storage.engine }}
{%- endif %}
+
#
# The default scheme to use for storing images.
#
@@ -3224,184 +3229,10 @@
{% endif %}
-#
-# Address of the ESX/ESXi or vCenter Server target system.
-#
-# This configuration option sets the address of the ESX/ESXi or vCenter
-# Server target system. This option is required when using the VMware
-# storage backend. The address can contain an IP address (127.0.0.1) or
-# a DNS name (www.my-domain.com).
-#
-# Possible Values:
-# * A valid IPv4 or IPv6 address
-# * A valid DNS name
-#
-# Related options:
-# * vmware_server_username
-# * vmware_server_password
-#
-# (string value)
-#vmware_server_host = 127.0.0.1
-
-#
-# Server username.
-#
-# This configuration option takes the username for authenticating with
-# the VMware ESX/ESXi or vCenter Server. This option is required when
-# using the VMware storage backend.
-#
-# Possible Values:
-# * Any string that is the username for a user with appropriate
-# privileges
-#
-# Related options:
-# * vmware_server_host
-# * vmware_server_password
-#
-# (string value)
-#vmware_server_username = root
-
-#
-# Server password.
-#
-# This configuration option takes the password for authenticating with
-# the VMware ESX/ESXi or vCenter Server. This option is required when
-# using the VMware storage backend.
-#
-# Possible Values:
-# * Any string that is a password corresponding to the username
-# specified using the "vmware_server_username" option
-#
-# Related options:
-# * vmware_server_host
-# * vmware_server_username
-#
-# (string value)
-#vmware_server_password = vmware
-
-#
-# The number of VMware API retries.
-#
-# This configuration option specifies the number of times the VMware
-# ESX/VC server API must be retried upon connection related issues or
-# server API call overload. It is not possible to specify 'retry
-# forever'.
-#
-# Possible Values:
-# * Any positive integer value
-#
-# Related options:
-# * None
-#
-# (integer value)
-# Minimum value: 1
-#vmware_api_retry_count = 10
-
-#
-# Interval in seconds used for polling remote tasks invoked on VMware
-# ESX/VC server.
-#
-# This configuration option takes in the sleep time in seconds for polling an
-# on-going async task as part of the VMWare ESX/VC server API call.
-#
-# Possible Values:
-# * Any positive integer value
-#
-# Related options:
-# * None
-#
-# (integer value)
-# Minimum value: 1
-#vmware_task_poll_interval = 5
-
-#
-# The directory where the glance images will be stored in the datastore.
-#
-# This configuration option specifies the path to the directory where the
-# glance images will be stored in the VMware datastore. If this option
-# is not set, the default directory where the glance images are stored
-# is openstack_glance.
-#
-# Possible Values:
-# * Any string that is a valid path to a directory
-#
-# Related options:
-# * None
-#
-# (string value)
-#vmware_store_image_dir = /openstack_glance
-
-#
-# Set verification of the ESX/vCenter server certificate.
-#
-# This configuration option takes a boolean value to determine
-# whether or not to verify the ESX/vCenter server certificate. If this
-# option is set to True, the ESX/vCenter server certificate is not
-# verified. If this option is set to False, then the default CA
-# truststore is used for verification.
-#
-# This option is ignored if the "vmware_ca_file" option is set. In that
-# case, the ESX/vCenter server certificate will then be verified using
-# the file specified using the "vmware_ca_file" option .
-#
-# Possible Values:
-# * True
-# * False
-#
-# Related options:
-# * vmware_ca_file
-#
-# (boolean value)
-# Deprecated group/name - [glance_store]/vmware_api_insecure
-#vmware_insecure = false
-
-#
-# Absolute path to the CA bundle file.
-#
-# This configuration option enables the operator to use a custom
-# Cerificate Authority File to verify the ESX/vCenter certificate.
-#
-# If this option is set, the "vmware_insecure" option will be ignored
-# and the CA file specified will be used to authenticate the ESX/vCenter
-# server certificate and establish a secure connection to the server.
-#
-# Possible Values:
-# * Any string that is a valid absolute path to a CA file
-#
-# Related options:
-# * vmware_insecure
-#
-# (string value)
-#vmware_ca_file = /etc/ssl/certs/ca-certificates.crt
-
-#
-# The datastores where the image can be stored.
-#
-# This configuration option specifies the datastores where the image can
-# be stored in the VMWare store backend. This option may be specified
-# multiple times for specifying multiple datastores. The datastore name
-# should be specified after its datacenter path, separated by ":". An
-# optional weight may be given after the datastore name, separated again
-# by ":" to specify the priority. Thus, the required format becomes
-# <datacenter_path>:<datastore_name>:<optional_weight>.
-#
-# When adding an image, the datastore with highest weight will be
-# selected, unless there is not enough free space available in cases
-# where the image size is already known. If no weight is given, it is
-# assumed to be zero and the directory will be considered for selection
-# last. If multiple datastores have the same weight, then the one with
-# the most free space available is selected.
-#
-# Possible Values:
-# * Any string of the format:
-# <datacenter_path>:<datastore_name>:<optional_weight>
-#
-# Related options:
-# * None
-#
-# (multi valued)
-#vmware_datastores =
-
+{%- if server.storage is defined and server.storage.get('vmware', {}).get('enabled')%}
+{%- set _data = server.storage.vmware %}
+{%- include "glance/files/pike/stores/_vmware.conf" %}
+{%- endif %}
[image_format]
@@ -4208,7 +4039,7 @@
# Whether the application is behind a proxy or not. This determines if the
# middleware should parse the headers or not. (boolean value)
-#enable_proxy_headers_parsing = false
+enable_proxy_headers_parsing = {{ server.get('enable_proxy_headers_parsing', true) }}
[oslo_policy]
diff --git a/glance/files/pike/glance-cache.conf.Debian b/glance/files/pike/glance-cache.conf.Debian
index ac13f7a..7d2432b 100644
--- a/glance/files/pike/glance-cache.conf.Debian
+++ b/glance/files/pike/glance-cache.conf.Debian
@@ -554,7 +554,12 @@
# (integer value)
# Minimum value: 0
#image_cache_max_size = 10737418240
-image_cache_max_size = 189668314316
+{% if server.get('image_cache', {}).get('enabled', False) %}
+
+image_cache_max_size = {{ server.image_cache.get('max_size', '10737418240') }}
+image_cache_stall_time = {{ server.image_cache.get('stall_time', '86400') }}
+image_cache_dir = {{ server.image_cache.get('directory', '/var/lib/glance/image-cache/') }}
+{% endif %}
{% if server.identity.region is defined %}
os_region_name = {{ server.identity.region }}
@@ -583,7 +588,6 @@
# (integer value)
# Minimum value: 0
#image_cache_stall_time = 86400
-image_cache_stall_time = 86400
#
# Base directory for image cache.
@@ -617,7 +621,7 @@
#
# (string value)
#image_cache_dir = <None>
-image_cache_dir = /var/lib/glance/image-cache/
+#image_cache_dir = /var/lib/glance/image-cache/
#
# Address the registry server is hosted on.
@@ -2106,187 +2110,15 @@
# (string value)
#swift_store_config_file = <None>
-#
-# Address of the ESX/ESXi or vCenter Server target system.
-#
-# This configuration option sets the address of the ESX/ESXi or vCenter
-# Server target system. This option is required when using the VMware
-# storage backend. The address can contain an IP address (127.0.0.1) or
-# a DNS name (www.my-domain.com).
-#
-# Possible Values:
-# * A valid IPv4 or IPv6 address
-# * A valid DNS name
-#
-# Related options:
-# * vmware_server_username
-# * vmware_server_password
-#
-# (string value)
-#vmware_server_host = 127.0.0.1
-
-#
-# Server username.
-#
-# This configuration option takes the username for authenticating with
-# the VMware ESX/ESXi or vCenter Server. This option is required when
-# using the VMware storage backend.
-#
-# Possible Values:
-# * Any string that is the username for a user with appropriate
-# privileges
-#
-# Related options:
-# * vmware_server_host
-# * vmware_server_password
-#
-# (string value)
-#vmware_server_username = root
-
-#
-# Server password.
-#
-# This configuration option takes the password for authenticating with
-# the VMware ESX/ESXi or vCenter Server. This option is required when
-# using the VMware storage backend.
-#
-# Possible Values:
-# * Any string that is a password corresponding to the username
-# specified using the "vmware_server_username" option
-#
-# Related options:
-# * vmware_server_host
-# * vmware_server_username
-#
-# (string value)
-#vmware_server_password = vmware
-
-#
-# The number of VMware API retries.
-#
-# This configuration option specifies the number of times the VMware
-# ESX/VC server API must be retried upon connection related issues or
-# server API call overload. It is not possible to specify 'retry
-# forever'.
-#
-# Possible Values:
-# * Any positive integer value
-#
-# Related options:
-# * None
-#
-# (integer value)
-# Minimum value: 1
-#vmware_api_retry_count = 10
-
-#
-# Interval in seconds used for polling remote tasks invoked on VMware
-# ESX/VC server.
-#
-# This configuration option takes in the sleep time in seconds for polling an
-# on-going async task as part of the VMWare ESX/VC server API call.
-#
-# Possible Values:
-# * Any positive integer value
-#
-# Related options:
-# * None
-#
-# (integer value)
-# Minimum value: 1
-#vmware_task_poll_interval = 5
-
-#
-# The directory where the glance images will be stored in the datastore.
-#
-# This configuration option specifies the path to the directory where the
-# glance images will be stored in the VMware datastore. If this option
-# is not set, the default directory where the glance images are stored
-# is openstack_glance.
-#
-# Possible Values:
-# * Any string that is a valid path to a directory
-#
-# Related options:
-# * None
-#
-# (string value)
-#vmware_store_image_dir = /openstack_glance
-
-#
-# Set verification of the ESX/vCenter server certificate.
-#
-# This configuration option takes a boolean value to determine
-# whether or not to verify the ESX/vCenter server certificate. If this
-# option is set to True, the ESX/vCenter server certificate is not
-# verified. If this option is set to False, then the default CA
-# truststore is used for verification.
-#
-# This option is ignored if the "vmware_ca_file" option is set. In that
-# case, the ESX/vCenter server certificate will then be verified using
-# the file specified using the "vmware_ca_file" option .
-#
-# Possible Values:
-# * True
-# * False
-#
-# Related options:
-# * vmware_ca_file
-#
-# (boolean value)
-# Deprecated group/name - [glance_store]/vmware_api_insecure
-#vmware_insecure = false
-
-#
-# Absolute path to the CA bundle file.
-#
-# This configuration option enables the operator to use a custom
-# Cerificate Authority File to verify the ESX/vCenter certificate.
-#
-# If this option is set, the "vmware_insecure" option will be ignored
-# and the CA file specified will be used to authenticate the ESX/vCenter
-# server certificate and establish a secure connection to the server.
-#
-# Possible Values:
-# * Any string that is a valid absolute path to a CA file
-#
-# Related options:
-# * vmware_insecure
-#
-# (string value)
-#vmware_ca_file = /etc/ssl/certs/ca-certificates.crt
-
-#
-# The datastores where the image can be stored.
-#
-# This configuration option specifies the datastores where the image can
-# be stored in the VMWare store backend. This option may be specified
-# multiple times for specifying multiple datastores. The datastore name
-# should be specified after its datacenter path, separated by ":". An
-# optional weight may be given after the datastore name, separated again
-# by ":" to specify the priority. Thus, the required format becomes
-# <datacenter_path>:<datastore_name>:<optional_weight>.
-#
-# When adding an image, the datastore with highest weight will be
-# selected, unless there is not enough free space available in cases
-# where the image size is already known. If no weight is given, it is
-# assumed to be zero and the directory will be considered for selection
-# last. If multiple datastores have the same weight, then the one with
-# the most free space available is selected.
-#
-# Possible Values:
-# * Any string of the format:
-# <datacenter_path>:<datastore_name>:<optional_weight>
-#
-# Related options:
-# * None
-#
-# (multi valued)
-#vmware_datastores =
{% if server.identity.region is defined %}
os_region_name = {{ server.identity.region }}
{% endif %}
+{%- if server.storage is defined and server.storage.get('vmware', {}).get('enabled') %}
+{%- set _data = server.storage.vmware %}
+{%- include "glance/files/pike/stores/_vmware.conf" %}
+{%- endif %}
+
[oslo_policy]
diff --git a/glance/files/pike/stores/_vmware.conf b/glance/files/pike/stores/_vmware.conf
new file mode 100644
index 0000000..89c931a
--- /dev/null
+++ b/glance/files/pike/stores/_vmware.conf
@@ -0,0 +1,211 @@
+
+#
+# Address of the ESX/ESXi or vCenter Server target system.
+#
+# This configuration option sets the address of the ESX/ESXi or vCenter
+# Server target system. This option is required when using the VMware
+# storage backend. The address can contain an IP address (127.0.0.1) or
+# a DNS name (www.my-domain.com).
+#
+# Possible Values:
+# * A valid IPv4 or IPv6 address
+# * A valid DNS name
+#
+# Related options:
+# * vmware_server_username
+# * vmware_server_password
+#
+# (unknown value)
+#vmware_server_host = 127.0.0.1
+{%- if _data.server_host is defined %}
+vmware_server_host = {{ _data.server_host }}
+{%- endif %}
+
+#
+# Server username.
+#
+# This configuration option takes the username for authenticating with
+# the VMware ESX/ESXi or vCenter Server. This option is required when
+# using the VMware storage backend.
+#
+# Possible Values:
+# * Any string that is the username for a user with appropriate
+# privileges
+#
+# Related options:
+# * vmware_server_host
+# * vmware_server_password
+#
+# (string value)
+#vmware_server_username = root
+vmware_server_username = {{ _data.server_username }}
+
+#
+# Server password.
+#
+# This configuration option takes the password for authenticating with
+# the VMware ESX/ESXi or vCenter Server. This option is required when
+# using the VMware storage backend.
+#
+# Possible Values:
+# * Any string that is a password corresponding to the username
+# specified using the "vmware_server_username" option
+#
+# Related options:
+# * vmware_server_host
+# * vmware_server_username
+#
+# (string value)
+#vmware_server_password = vmware
+vmware_server_password = {{ _data.server_password }}
+
+#
+# The number of VMware API retries.
+#
+# This configuration option specifies the number of times the VMware
+# ESX/VC server API must be retried upon connection related issues or
+# server API call overload. It is not possible to specify 'retry
+# forever'.
+#
+# Possible Values:
+# * Any positive integer value
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 1
+#vmware_api_retry_count = 10
+{%- if _data.api_retry_count is defined %}
+vmware_api_retry_count = {{ _data.api_retry_count }}
+{%- endif %}
+
+#
+# Interval in seconds used for polling remote tasks invoked on VMware
+# ESX/VC server.
+#
+# This configuration option takes in the sleep time in seconds for polling an
+# on-going async task as part of the VMWare ESX/VC server API call.
+#
+# Possible Values:
+# * Any positive integer value
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 1
+#vmware_task_poll_interval = 5
+{%- if _data.task_poll_interval is defined %}
+vmware_task_poll_interval = {{ _data.task_poll_interval }}
+{%- endif %}
+
+#
+# The directory where the glance images will be stored in the datastore.
+#
+# This configuration option specifies the path to the directory where the
+# glance images will be stored in the VMware datastore. If this option
+# is not set, the default directory where the glance images are stored
+# is openstack_glance.
+#
+# Possible Values:
+# * Any string that is a valid path to a directory
+#
+# Related options:
+# * None
+#
+# (string value)
+#vmware_store_image_dir = /openstack_glance
+{%- if _data.store_image_dir is defined %}
+vmware_store_image_dir = {{ _data.store_image_dir }}
+{%- endif %}
+
+#
+# Set verification of the ESX/vCenter server certificate.
+#
+# This configuration option takes a boolean value to determine
+# whether or not to verify the ESX/vCenter server certificate. If this
+# option is set to True, the ESX/vCenter server certificate is not
+# verified. If this option is set to False, then the default CA
+# truststore is used for verification.
+#
+# This option is ignored if the "vmware_ca_file" option is set. In that
+# case, the ESX/vCenter server certificate will then be verified using
+# the file specified using the "vmware_ca_file" option .
+#
+# Possible Values:
+# * True
+# * False
+#
+# Related options:
+# * vmware_ca_file
+#
+# (boolean value)
+# Deprecated group/name - [glance_store]/vmware_api_insecure
+#vmware_insecure = false
+{%- if _data.insecure is defined %}
+vmware_insecure = {{ _data.insecure }}
+{%- endif %}
+
+#
+# Absolute path to the CA bundle file.
+#
+# This configuration option enables the operator to use a custom
+# Cerificate Authority File to verify the ESX/vCenter certificate.
+#
+# If this option is set, the "vmware_insecure" option will be ignored
+# and the CA file specified will be used to authenticate the ESX/vCenter
+# server certificate and establish a secure connection to the server.
+#
+# Possible Values:
+# * Any string that is a valid absolute path to a CA file
+#
+# Related options:
+# * vmware_insecure
+#
+# (string value)
+#vmware_ca_file = /etc/ssl/certs/ca-certificates.crt
+{%- if _data.cacert_file is defined %}
+vmware_ca_file = {{ _data.cacert_file }}
+{%- endif %}
+
+#
+# The datastores where the image can be stored.
+#
+# This configuration option specifies the datastores where the image can
+# be stored in the VMWare store backend. This option may be specified
+# multiple times for specifying multiple datastores. The datastore name
+# should be specified after its datacenter path, separated by ":". An
+# optional weight may be given after the datastore name, separated again
+# by ":" to specify the priority. Thus, the required format becomes
+# <datacenter_path>:<datastore_name>:<optional_weight>.
+#
+# When adding an image, the datastore with highest weight will be
+# selected, unless there is not enough free space available in cases
+# where the image size is already known. If no weight is given, it is
+# assumed to be zero and the directory will be considered for selection
+# last. If multiple datastores have the same weight, then the one with
+# the most free space available is selected.
+#
+# Possible Values:
+# * Any string of the format:
+# <datacenter_path>:<datastore_name>:<optional_weight>
+#
+# Related options:
+# * None
+#
+# (multi valued)
+#vmware_datastores =
+{%- if _data.datastores is defined %}
+{%- for dname,ddata in _data.datastores.iteritems() %}
+{%- set vmware_datastores = [] %}
+{%- if ddata.get('enabled', False) %}
+{%- do vmware_datastores.append(ddata.path) %}
+{%- do vmware_datastores.append(ddata.get('name', dname)) %}
+{%- if ddata.weight is defined %}
+{%- do vmware_datastores.append(ddata.weight|string) %}
+{%- endif %}
+{%- endif %}
+vmware_datastores = {{ ':'.join(vmware_datastores) }}
+{%- endfor %}
+{%- endif %}
diff --git a/glance/files/queens/glance-api-paste.ini b/glance/files/queens/glance-api-paste.ini
new file mode 100644
index 0000000..3c208ce
--- /dev/null
+++ b/glance/files/queens/glance-api-paste.ini
@@ -0,0 +1,97 @@
+{%- from "glance/map.jinja" import server with context %}
+# Use this pipeline for no auth or image caching - DEFAULT
+[pipeline:glance-api]
+pipeline = cors healthcheck http_proxy_to_wsgi versionnegotiation osprofiler unauthenticated-context {% if server.audit.enabled %}audit {% endif %}rootapp
+
+# Use this pipeline for image caching and no auth
+[pipeline:glance-api-caching]
+pipeline = cors healthcheck http_proxy_to_wsgi versionnegotiation osprofiler unauthenticated-context cache {% if server.audit.enabled %}audit {% endif %}rootapp
+
+# Use this pipeline for caching w/ management interface but no auth
+[pipeline:glance-api-cachemanagement]
+pipeline = cors healthcheck http_proxy_to_wsgi versionnegotiation osprofiler {% if server.audit.enabled %}audit {% endif %}unauthenticated-context cache cachemanage rootapp
+
+# Use this pipeline for keystone auth
+[pipeline:glance-api-keystone]
+pipeline = cors healthcheck http_proxy_to_wsgi versionnegotiation osprofiler authtoken {% if server.audit.enabled %}audit {% endif %}context rootapp
+
+# Use this pipeline for keystone auth with image caching
+[pipeline:glance-api-keystone+caching]
+pipeline = cors healthcheck http_proxy_to_wsgi versionnegotiation osprofiler authtoken {% if server.audit.enabled %}audit {% endif %}context cache rootapp
+
+# Use this pipeline for keystone auth with caching and cache management
+[pipeline:glance-api-keystone+cachemanagement]
+pipeline = cors healthcheck http_proxy_to_wsgi versionnegotiation osprofiler authtoken {% if server.audit.enabled %}audit {% endif %}context cache cachemanage rootapp
+
+# Use this pipeline for authZ only. This means that the registry will treat a
+# user as authenticated without making requests to keystone to reauthenticate
+# the user.
+[pipeline:glance-api-trusted-auth]
+pipeline = cors healthcheck http_proxy_to_wsgi versionnegotiation osprofiler {% if server.audit.enabled %}audit {% endif %}context rootapp
+
+# Use this pipeline for authZ only. This means that the registry will treat a
+# user as authenticated without making requests to keystone to reauthenticate
+# the user and uses cache management
+[pipeline:glance-api-trusted-auth+cachemanagement]
+pipeline = cors healthcheck http_proxy_to_wsgi versionnegotiation osprofiler {% if server.audit.enabled %}audit {% endif %}context cache cachemanage rootapp
+
+[composite:rootapp]
+paste.composite_factory = glance.api:root_app_factory
+/: apiversions
+/v1: apiv1app
+/v2: apiv2app
+
+[app:apiversions]
+paste.app_factory = glance.api.versions:create_resource
+
+[app:apiv1app]
+paste.app_factory = glance.api.v1.router:API.factory
+
+[app:apiv2app]
+paste.app_factory = glance.api.v2.router:API.factory
+
+[filter:healthcheck]
+paste.filter_factory = oslo_middleware:Healthcheck.factory
+backends = disable_by_file
+disable_by_file_path = /etc/glance/healthcheck_disable
+
+[filter:versionnegotiation]
+paste.filter_factory = glance.api.middleware.version_negotiation:VersionNegotiationFilter.factory
+
+[filter:cache]
+paste.filter_factory = glance.api.middleware.cache:CacheFilter.factory
+
+[filter:cachemanage]
+paste.filter_factory = glance.api.middleware.cache_manage:CacheManageFilter.factory
+
+[filter:context]
+paste.filter_factory = glance.api.middleware.context:ContextMiddleware.factory
+
+[filter:unauthenticated-context]
+paste.filter_factory = glance.api.middleware.context:UnauthenticatedContextMiddleware.factory
+
+[filter:authtoken]
+paste.filter_factory = keystonemiddleware.auth_token:filter_factory
+delay_auth_decision = true
+
+[filter:gzip]
+paste.filter_factory = glance.api.middleware.gzip:GzipMiddleware.factory
+
+[filter:osprofiler]
+paste.filter_factory = osprofiler.web:WsgiMiddleware.factory
+hmac_keys = SECRET_KEY #DEPRECATED
+enabled = yes #DEPRECATED
+
+{%- if server.audit.enabled %}
+[filter:audit]
+paste.filter_factory = {{ server.get("audit", {}).get("filter_factory", "keystonemiddleware.audit:filter_factory") }}
+audit_map_file = {{ server.get("audit", {}).get("map_file", "/etc/pycadf/glance_api_audit_map.conf") }}
+{%- endif %}
+
+[filter:cors]
+paste.filter_factory = oslo_middleware.cors:filter_factory
+oslo_config_project = glance
+oslo_config_program = glance-api
+
+[filter:http_proxy_to_wsgi]
+paste.filter_factory = oslo_middleware:HTTPProxyToWSGI.factory
diff --git a/glance/files/queens/glance-api.conf.Debian b/glance/files/queens/glance-api.conf.Debian
new file mode 100644
index 0000000..d1de46c
--- /dev/null
+++ b/glance/files/queens/glance-api.conf.Debian
@@ -0,0 +1,3617 @@
+{%- from "glance/map.jinja" import server with context %}
+{% set storage_engines = server.storage.engine.split(',') %}
+[DEFAULT]
+
+{%- set _data = server.message_queue %}
+{%- include "oslo_templates/files/queens/oslo/messaging/_default.conf" %}
+
+#
+# From glance.api
+#
+
+#
+# Set the image owner to tenant or the authenticated user.
+#
+# Assign a boolean value to determine the owner of an image. When set
+# to
+# True, the owner of the image is the tenant. When set to False, the
+# owner of the image will be the authenticated user issuing the
+# request.
+# Setting it to False makes the image private to the associated user
+# and
+# sharing with other users within the same tenant (or "project")
+# requires explicit image sharing via image membership.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * None
+#
+# (boolean value)
+#owner_is_tenant = true
+
+#
+# Role used to identify an authenticated user as administrator.
+#
+# Provide a string value representing a Keystone role to identify an
+# administrative user. Users with this role will be granted
+# administrative privileges. The default value for this option is
+# 'admin'.
+#
+# Possible values:
+# * A string value which is a valid Keystone role
+#
+# Related options:
+# * None
+#
+# (string value)
+#admin_role = admin
+
+#
+# Allow limited access to unauthenticated users.
+#
+# Assign a boolean to determine API access for unathenticated
+# users. When set to False, the API cannot be accessed by
+# unauthenticated users. When set to True, unauthenticated users can
+# access the API with read-only privileges. This however only applies
+# when using ContextMiddleware.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * None
+#
+# (boolean value)
+#allow_anonymous_access = false
+
+#
+# Limit the request ID length.
+#
+# Provide an integer value to limit the length of the request ID to
+# the specified length. The default value is 64. Users can change this
+# to any ineteger value between 0 and 16384 however keeping in mind
+# that
+# a larger value may flood the logs.
+#
+# Possible values:
+# * Integer value between 0 and 16384
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+#max_request_id_length = 64
+
+#
+# Public url endpoint to use for Glance versions response.
+#
+# This is the public url endpoint that will appear in the Glance
+# "versions" response. If no value is specified, the endpoint that is
+# displayed in the version's response is that of the host running the
+# API service. Change the endpoint to represent the proxy URL if the
+# API service is running behind a proxy. If the service is running
+# behind a load balancer, add the load balancer's URL for this value.
+#
+# Possible values:
+# * None
+# * Proxy URL
+# * Load balancer URL
+#
+# Related options:
+# * None
+#
+# (string value)
+#public_endpoint = <None>
+
+#
+# Allow users to add additional/custom properties to images.
+#
+# Glance defines a standard set of properties (in its schema) that
+# appear on every image. These properties are also known as
+# ``base properties``. In addition to these properties, Glance
+# allows users to add custom properties to images. These are known
+# as ``additional properties``.
+#
+# By default, this configuration option is set to ``True`` and users
+# are allowed to add additional properties. The number of additional
+# properties that can be added to an image can be controlled via
+# ``image_property_quota`` configuration option.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * image_property_quota
+#
+# (boolean value)
+#allow_additional_image_properties = true
+
+#
+# Maximum number of image members per image.
+#
+# This limits the maximum of users an image can be shared with. Any
+# negative
+# value is interpreted as unlimited.
+#
+# Related options:
+# * None
+#
+# (integer value)
+#image_member_quota = 128
+{%- if server.quota is defined %}
+{%- if server.quota.image_member is defined %}
+image_member_quota = {{ server.quota.image_member|default('128') }}
+{%- endif %}
+{%- endif %}
+
+#
+# Maximum number of properties allowed on an image.
+#
+# This enforces an upper limit on the number of additional properties
+# an image
+# can have. Any negative value is interpreted as unlimited.
+#
+# NOTE: This won't have any impact if additional properties are
+# disabled. Please
+# refer to ``allow_additional_image_properties``.
+#
+# Related options:
+# * ``allow_additional_image_properties``
+#
+# (integer value)
+#image_property_quota = 128
+{%- if server.quota is defined %}
+{%- if server.quota.image_property is defined %}
+image_property_quota = {{ server.quota.image_property|default('128') }}
+{%- endif %}
+{%- endif %}
+
+#
+# Maximum number of tags allowed on an image.
+#
+# Any negative value is interpreted as unlimited.
+#
+# Related options:
+# * None
+#
+# (integer value)
+#image_tag_quota = 128
+{%- if server.quota is defined %}
+{%- if server.quota.image_tag is defined %}
+image_tag_quota = {{ server.quota.image_tag|default('128') }}
+{%- endif %}
+{%- endif %}
+
+#
+# Maximum number of locations allowed on an image.
+#
+# Any negative value is interpreted as unlimited.
+#
+# Related options:
+# * None
+#
+# (integer value)
+#image_location_quota = 10
+{%- if server.quota is defined %}
+{%- if server.quota.image_location is defined %}
+image_location_quota = {{ server.quota.image_location|default('10') }}
+{%- endif %}
+{%- endif %}
+
+# DEPRECATED:
+# Python module path of data access API.
+#
+# Specifies the path to the API to use for accessing the data model.
+# This option determines how the image catalog data will be accessed.
+#
+# Possible values:
+# * glance.db.sqlalchemy.api
+# * glance.db.registry.api
+# * glance.db.simple.api
+#
+# If this option is set to ``glance.db.sqlalchemy.api`` then the image
+# catalog data is stored in and read from the database via the
+# SQLAlchemy Core and ORM APIs.
+#
+# Setting this option to ``glance.db.registry.api`` will force all
+# database access requests to be routed through the Registry service.
+# This avoids data access from the Glance API nodes for an added layer
+# of security, scalability and manageability.
+#
+# NOTE: In v2 OpenStack Images API, the registry service is optional.
+# In order to use the Registry API in v2, the option
+# ``enable_v2_registry`` must be set to ``True``.
+#
+# Finally, when this configuration option is set to
+# ``glance.db.simple.api``, image catalog data is stored in and read
+# from an in-memory data structure. This is primarily used for
+# testing.
+#
+# Related options:
+# * enable_v2_api
+# * enable_v2_registry
+#
+# (string value)
+# This option is deprecated for removal since Queens.
+# Its value may be silently ignored in the future.
+# Reason:
+# Glance registry service is deprecated for removal.
+#
+# More information can be found from the spec:
+# http://specs.openstack.org/openstack/glance-
+# specs/specs/queens/approved/glance/deprecate-registry.html
+#data_api = glance.db.sqlalchemy.api
+
+#
+# The default number of results to return for a request.
+#
+# Responses to certain API requests, like list images, may return
+# multiple items. The number of results returned can be explicitly
+# controlled by specifying the ``limit`` parameter in the API request.
+# However, if a ``limit`` parameter is not specified, this
+# configuration value will be used as the default number of results to
+# be returned for any API request.
+#
+# NOTES:
+# * The value of this configuration option may not be greater than
+# the value specified by ``api_limit_max``.
+# * Setting this to a very large value may slow down database
+# queries and increase response times. Setting this to a
+# very low value may result in poor user experience.
+#
+# Possible values:
+# * Any positive integer
+#
+# Related options:
+# * api_limit_max
+#
+# (integer value)
+# Minimum value: 1
+#limit_param_default = 25
+limit_param_default = {{ server.limit_default|default('25') }}
+
+#
+# Maximum number of results that could be returned by a request.
+#
+# As described in the help text of ``limit_param_default``, some
+# requests may return multiple results. The number of results to be
+# returned are governed either by the ``limit`` parameter in the
+# request or the ``limit_param_default`` configuration option.
+# The value in either case, can't be greater than the absolute maximum
+# defined by this configuration option. Anything greater than this
+# value is trimmed down to the maximum value defined here.
+#
+# NOTE: Setting this to a very large value may slow down database
+# queries and increase response times. Setting this to a
+# very low value may result in poor user experience.
+#
+# Possible values:
+# * Any positive integer
+#
+# Related options:
+# * limit_param_default
+#
+# (integer value)
+# Minimum value: 1
+#api_limit_max = 1000
+api_limit_max = {{ server.api_limit_max|default('1000') }}
+
+#
+# Show direct image location when returning an image.
+#
+# This configuration option indicates whether to show the direct image
+# location when returning image details to the user. The direct image
+# location is where the image data is stored in backend storage. This
+# image location is shown under the image property ``direct_url``.
+#
+# When multiple image locations exist for an image, the best location
+# is displayed based on the location strategy indicated by the
+# configuration option ``location_strategy``.
+#
+# NOTES:
+# * Revealing image locations can present a GRAVE SECURITY RISK as
+# image locations can sometimes include credentials. Hence, this
+# is set to ``False`` by default. Set this to ``True`` with
+# EXTREME CAUTION and ONLY IF you know what you are doing!
+# * If an operator wishes to avoid showing any image location(s)
+# to the user, then both this option and
+# ``show_multiple_locations`` MUST be set to ``False``.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * show_multiple_locations
+# * location_strategy
+#
+# (boolean value)
+#show_image_direct_url = false
+show_image_direct_url = {{ server.get('show_image_direct_url', True)|lower }}
+
+# DEPRECATED:
+# Show all image locations when returning an image.
+#
+# This configuration option indicates whether to show all the image
+# locations when returning image details to the user. When multiple
+# image locations exist for an image, the locations are ordered based
+# on the location strategy indicated by the configuration opt
+# ``location_strategy``. The image locations are shown under the
+# image property ``locations``.
+#
+# NOTES:
+# * Revealing image locations can present a GRAVE SECURITY RISK as
+# image locations can sometimes include credentials. Hence, this
+# is set to ``False`` by default. Set this to ``True`` with
+# EXTREME CAUTION and ONLY IF you know what you are doing!
+# * If an operator wishes to avoid showing any image location(s)
+# to the user, then both this option and
+# ``show_image_direct_url`` MUST be set to ``False``.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * show_image_direct_url
+# * location_strategy
+#
+# (boolean value)
+# This option is deprecated for removal since Newton.
+# Its value may be silently ignored in the future.
+# Reason: This option will be removed in the Pike release or later
+# because the same functionality can be achieved with greater
+# granularity by using policies. Please see the Newton release notes
+# for more information.
+#show_multiple_locations = false
+#show_multiple_locations = {{ server.get('show_multiple_locations', False) | lower }}
+
+#
+# Maximum size of image a user can upload in bytes.
+#
+# An image upload greater than the size mentioned here would result
+# in an image creation failure. This configuration option defaults to
+# 1099511627776 bytes (1 TiB).
+#
+# NOTES:
+# * This value should only be increased after careful
+# consideration and must be set less than or equal to
+# 8 EiB (9223372036854775808).
+# * This value must be set with careful consideration of the
+# backend storage capacity. Setting this to a very low value
+# may result in a large number of image failures. And, setting
+# this to a very large value may result in faster consumption
+# of storage. Hence, this must be set according to the nature of
+# images created and storage capacity available.
+#
+# Possible values:
+# * Any positive number less than or equal to 9223372036854775808
+#
+# (integer value)
+# Minimum value: 1
+# Maximum value: 9223372036854775808
+#image_size_cap = 1099511627776
+
+#
+# Maximum amount of image storage per tenant.
+#
+# This enforces an upper limit on the cumulative storage consumed by
+# all images
+# of a tenant across all stores. This is a per-tenant limit.
+#
+# The default unit for this configuration option is Bytes. However,
+# storage
+# units can be specified using case-sensitive literals ``B``, ``KB``,
+# ``MB``,
+# ``GB`` and ``TB`` representing Bytes, KiloBytes, MegaBytes,
+# GigaBytes and
+# TeraBytes respectively. Note that there should not be any space
+# between the
+# value and unit. Value ``0`` signifies no quota enforcement. Negative
+# values
+# are invalid and result in errors.
+#
+# Possible values:
+# * A string that is a valid concatenation of a non-negative
+# integer
+# representing the storage value and an optional string literal
+# representing storage units as mentioned above.
+#
+# Related options:
+# * None
+#
+# (string value)
+#user_storage_quota = 0
+{%- if server.quota is defined %}
+{%- if server.quota.user_storage is defined %}
+user_storage_quota = {{ server.quota.user_storage|default('0') }}
+{%- endif %}
+{%- endif %}
+
+#
+# Deploy the v1 OpenStack Images API.
+#
+# When this option is set to ``True``, Glance service will respond to
+# requests on registered endpoints conforming to the v1 OpenStack
+# Images API.
+#
+# NOTES:
+# * If this option is enabled, then ``enable_v1_registry`` must
+# also be set to ``True`` to enable mandatory usage of Registry
+# service with v1 API.
+#
+# * If this option is disabled, then the ``enable_v1_registry``
+# option, which is enabled by default, is also recommended
+# to be disabled.
+#
+# * This option is separate from ``enable_v2_api``, both v1 and v2
+# OpenStack Images API can be deployed independent of each
+# other.
+#
+# * If deploying only the v2 Images API, this option, which is
+# enabled by default, should be disabled.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * enable_v1_registry
+# * enable_v2_api
+#
+# (boolean value)
+#enable_v1_api = true
+enable_v1_api=False
+
+#
+# Deploy the v2 OpenStack Images API.
+#
+# When this option is set to ``True``, Glance service will respond
+# to requests on registered endpoints conforming to the v2 OpenStack
+# Images API.
+#
+# NOTES:
+# * If this option is disabled, then the ``enable_v2_registry``
+# option, which is enabled by default, is also recommended
+# to be disabled.
+#
+# * This option is separate from ``enable_v1_api``, both v1 and v2
+# OpenStack Images API can be deployed independent of each
+# other.
+#
+# * If deploying only the v1 Images API, this option, which is
+# enabled by default, should be disabled.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * enable_v2_registry
+# * enable_v1_api
+#
+# (boolean value)
+#enable_v2_api = true
+enable_v2_api=True
+
+#
+# Deploy the v1 API Registry service.
+#
+# When this option is set to ``True``, the Registry service
+# will be enabled in Glance for v1 API requests.
+#
+# NOTES:
+# * Use of Registry is mandatory in v1 API, so this option must
+# be set to ``True`` if the ``enable_v1_api`` option is enabled.
+#
+# * If deploying only the v2 OpenStack Images API, this option,
+# which is enabled by default, should be disabled.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * enable_v1_api
+#
+# (boolean value)
+#enable_v1_registry = true
+
+# DEPRECATED:
+# Deploy the v2 API Registry service.
+#
+# When this option is set to ``True``, the Registry service
+# will be enabled in Glance for v2 API requests.
+#
+# NOTES:
+# * Use of Registry is optional in v2 API, so this option
+# must only be enabled if both ``enable_v2_api`` is set to
+# ``True`` and the ``data_api`` option is set to
+# ``glance.db.registry.api``.
+#
+# * If deploying only the v1 OpenStack Images API, this option,
+# which is enabled by default, should be disabled.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * enable_v2_api
+# * data_api
+#
+# (boolean value)
+# This option is deprecated for removal since Queens.
+# Its value may be silently ignored in the future.
+# Reason:
+# Glance registry service is deprecated for removal.
+#
+# More information can be found from the spec:
+# http://specs.openstack.org/openstack/glance-
+# specs/specs/queens/approved/glance/deprecate-registry.html
+#enable_v2_registry = true
+
+#
+# Host address of the pydev server.
+#
+# Provide a string value representing the hostname or IP of the
+# pydev server to use for debugging. The pydev server listens for
+# debug connections on this address, facilitating remote debugging
+# in Glance.
+#
+# Possible values:
+# * Valid hostname
+# * Valid IP address
+#
+# Related options:
+# * None
+#
+# (unknown value)
+#pydev_worker_debug_host = localhost
+
+#
+# Port number that the pydev server will listen on.
+#
+# Provide a port number to bind the pydev server to. The pydev
+# process accepts debug connections on this port and facilitates
+# remote debugging in Glance.
+#
+# Possible values:
+# * A valid port number
+#
+# Related options:
+# * None
+#
+# (port value)
+# Minimum value: 0
+# Maximum value: 65535
+#pydev_worker_debug_port = 5678
+
+#
+# AES key for encrypting store location metadata.
+#
+# Provide a string value representing the AES cipher to use for
+# encrypting Glance store metadata.
+#
+# NOTE: The AES key to use must be set to a random string of length
+# 16, 24 or 32 bytes.
+#
+# Possible values:
+# * String value representing a valid AES key
+#
+# Related options:
+# * None
+#
+# (string value)
+#metadata_encryption_key = <None>
+
+#
+# Digest algorithm to use for digital signature.
+#
+# Provide a string value representing the digest algorithm to
+# use for generating digital signatures. By default, ``sha256``
+# is used.
+#
+# To get a list of the available algorithms supported by the version
+# of OpenSSL on your platform, run the command:
+# ``openssl list-message-digest-algorithms``.
+# Examples are 'sha1', 'sha256', and 'sha512'.
+#
+# NOTE: ``digest_algorithm`` is not related to Glance's image signing
+# and verification. It is only used to sign the universally unique
+# identifier (UUID) as a part of the certificate file and key file
+# validation.
+#
+# Possible values:
+# * An OpenSSL message digest algorithm identifier
+#
+# Relation options:
+# * None
+#
+# (string value)
+#digest_algorithm = sha256
+
+#
+# The URL provides location where the temporary data will be stored
+#
+# This option is for Glance internal use only. Glance will save the
+# image data uploaded by the user to 'staging' endpoint during the
+# image import process.
+#
+# This option does not change the 'staging' API endpoint by any means.
+#
+# NOTE: It is discouraged to use same path as [task]/work_dir
+#
+# NOTE: 'file://<absolute-directory-path>' is the only option
+# api_image_import flow will support for now.
+#
+# NOTE: The staging path must be on shared filesystem available to all
+# Glance API nodes.
+#
+# Possible values:
+# * String starting with 'file://' followed by absolute FS path
+#
+# Related options:
+# * [task]/work_dir
+# * [DEFAULT]/enable_image_import (*deprecated*)
+#
+# (string value)
+#node_staging_uri = file:///tmp/staging/
+
+# DEPRECATED:
+# Enables the Image Import workflow introduced in Pike
+#
+# As '[DEFAULT]/node_staging_uri' is required for the Image
+# Import, it's disabled per default in Pike, enabled per
+# default in Queens and removed in Rocky. This allows Glance to
+# operate with previous version configs upon upgrade.
+#
+# Setting this option to False will disable the endpoints related
+# to Image Import Refactoring work.
+#
+# Related options:
+# * [DEFAULT]/node_staging_uri (boolean value)
+# This option is deprecated for removal since Pike.
+# Its value may be silently ignored in the future.
+# Reason:
+# This option is deprecated for removal in Rocky.
+#
+# It was introduced to make sure that the API is not enabled
+# before the '[DEFAULT]/node_staging_uri' is defined and is
+# long term redundant.
+#enable_image_import = true
+
+#
+# List of enabled Image Import Methods
+#
+# Both 'glance-direct' and 'web-download' are enabled by default.
+#
+# Related options:
+# * [DEFAULT]/node_staging_uri
+# * [DEFAULT]/enable_image_import (list value)
+#enabled_import_methods = glance-direct,web-download
+
+#
+# Strategy to determine the preference order of image locations.
+#
+# This configuration option indicates the strategy to determine
+# the order in which an image's locations must be accessed to
+# serve the image's data. Glance then retrieves the image data
+# from the first responsive active location it finds in this list.
+#
+# This option takes one of two possible values ``location_order``
+# and ``store_type``. The default value is ``location_order``,
+# which suggests that image data be served by using locations in
+# the order they are stored in Glance. The ``store_type`` value
+# sets the image location preference based on the order in which
+# the storage backends are listed as a comma separated list for
+# the configuration option ``store_type_preference``.
+#
+# Possible values:
+# * location_order
+# * store_type
+#
+# Related options:
+# * store_type_preference
+#
+# (string value)
+# Possible values:
+# location_order - <No description provided>
+# store_type - <No description provided>
+#location_strategy = location_order
+{% if server.get('location_strategy', 'location_order') == 'location_order' %}
+location_strategy = location_order
+{% else %}
+location_strategy = store_type
+{% endif %}
+
+#
+# The location of the property protection file.
+#
+# Provide a valid path to the property protection file which contains
+# the rules for property protections and the roles/policies associated
+# with them.
+#
+# A property protection file, when set, restricts the Glance image
+# properties to be created, read, updated and/or deleted by a specific
+# set of users that are identified by either roles or policies.
+# If this configuration option is not set, by default, property
+# protections won't be enforced. If a value is specified and the file
+# is not found, the glance-api service will fail to start.
+# More information on property protections can be found at:
+# https://docs.openstack.org/glance/latest/admin/property-
+# protections.html
+#
+# Possible values:
+# * Empty string
+# * Valid path to the property protection configuration file
+#
+# Related options:
+# * property_protection_rule_format
+#
+# (string value)
+#property_protection_file = <None>
+
+#
+# Rule format for property protection.
+#
+# Provide the desired way to set property protection on Glance
+# image properties. The two permissible values are ``roles``
+# and ``policies``. The default value is ``roles``.
+#
+# If the value is ``roles``, the property protection file must
+# contain a comma separated list of user roles indicating
+# permissions for each of the CRUD operations on each property
+# being protected. If set to ``policies``, a policy defined in
+# policy.json is used to express property protections for each
+# of the CRUD operations. Examples of how property protections
+# are enforced based on ``roles`` or ``policies`` can be found at:
+# https://docs.openstack.org/glance/latest/admin/property-
+# protections.html#examples
+#
+# Possible values:
+# * roles
+# * policies
+#
+# Related options:
+# * property_protection_file
+#
+# (string value)
+# Possible values:
+# roles - <No description provided>
+# policies - <No description provided>
+#property_protection_rule_format = roles
+
+#
+# List of allowed exception modules to handle RPC exceptions.
+#
+# Provide a comma separated list of modules whose exceptions are
+# permitted to be recreated upon receiving exception data via an RPC
+# call made to Glance. The default list includes
+# ``glance.common.exception``, ``builtins``, and ``exceptions``.
+#
+# The RPC protocol permits interaction with Glance via calls across a
+# network or within the same system. Including a list of exception
+# namespaces with this option enables RPC to propagate the exceptions
+# back to the users.
+#
+# Possible values:
+# * A comma separated list of valid exception modules
+#
+# Related options:
+# * None
+# (list value)
+#allowed_rpc_exception_modules = glance.common.exception,builtins,exceptions
+
+#
+# IP address to bind the glance servers to.
+#
+# Provide an IP address to bind the glance server to. The default
+# value is ``0.0.0.0``.
+#
+# Edit this option to enable the server to listen on one particular
+# IP address on the network card. This facilitates selection of a
+# particular network interface for the server.
+#
+# Possible values:
+# * A valid IPv4 address
+# * A valid IPv6 address
+#
+# Related options:
+# * None
+#
+# (unknown value)
+#bind_host = 0.0.0.0
+bind_host = {{ server.bind.address }}
+
+#
+# Port number on which the server will listen.
+#
+# Provide a valid port number to bind the server's socket to. This
+# port is then set to identify processes and forward network messages
+# that arrive at the server. The default bind_port value for the API
+# server is 9292 and for the registry server is 9191.
+#
+# Possible values:
+# * A valid port number (0 to 65535)
+#
+# Related options:
+# * None
+#
+# (port value)
+# Minimum value: 0
+# Maximum value: 65535
+#bind_port = <None>
+bind_port = {{ server.bind.port }}
+
+#
+# Number of Glance worker processes to start.
+#
+# Provide a non-negative integer value to set the number of child
+# process workers to service requests. By default, the number of CPUs
+# available is set as the value for ``workers`` limited to 8. For
+# example if the processor count is 6, 6 workers will be used, if the
+# processor count is 24 only 8 workers will be used. The limit will
+# only
+# apply to the default value, if 24 workers is configured, 24 is used.
+#
+# Each worker process is made to listen on the port set in the
+# configuration file and contains a greenthread pool of size 1000.
+#
+# NOTE: Setting the number of workers to zero, triggers the creation
+# of a single API process with a greenthread pool of size 1000.
+#
+# Possible values:
+# * 0
+# * Positive integer value (typically equal to the number of CPUs)
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+#workers = <None>
+workers = {{ server.workers }}
+
+#
+# Maximum line size of message headers.
+#
+# Provide an integer value representing a length to limit the size of
+# message headers. The default value is 16384.
+#
+# NOTE: ``max_header_line`` may need to be increased when using large
+# tokens (typically those generated by the Keystone v3 API with big
+# service catalogs). However, it is to be kept in mind that larger
+# values for ``max_header_line`` would flood the logs.
+#
+# Setting ``max_header_line`` to 0 sets no limit for the line size of
+# message headers.
+#
+# Possible values:
+# * 0
+# * Positive integer
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+#max_header_line = 16384
+
+#
+# Set keep alive option for HTTP over TCP.
+#
+# Provide a boolean value to determine sending of keep alive packets.
+# If set to ``False``, the server returns the header
+# "Connection: close". If set to ``True``, the server returns a
+# "Connection: Keep-Alive" in its responses. This enables retention of
+# the same TCP connection for HTTP conversations instead of opening a
+# new one with each new request.
+#
+# This option must be set to ``False`` if the client socket connection
+# needs to be closed explicitly after the response is received and
+# read successfully by the client.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * None
+#
+# (boolean value)
+#http_keepalive = true
+
+#
+# Timeout for client connections' socket operations.
+#
+# Provide a valid integer value representing time in seconds to set
+# the period of wait before an incoming connection can be closed. The
+# default value is 900 seconds.
+#
+# The value zero implies wait forever.
+#
+# Possible values:
+# * Zero
+# * Positive integer
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+#client_socket_timeout = 900
+
+#
+# Set the number of incoming connection requests.
+#
+# Provide a positive integer value to limit the number of requests in
+# the backlog queue. The default queue size is 4096.
+#
+# An incoming connection to a TCP listener socket is queued before a
+# connection can be established with the server. Setting the backlog
+# for a TCP socket ensures a limited queue size for incoming traffic.
+#
+# Possible values:
+# * Positive integer
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 1
+#backlog = 4096
+
+#
+# Set the wait time before a connection recheck.
+#
+# Provide a positive integer value representing time in seconds which
+# is set as the idle wait time before a TCP keep alive packet can be
+# sent to the host. The default value is 600 seconds.
+#
+# Setting ``tcp_keepidle`` helps verify at regular intervals that a
+# connection is intact and prevents frequent TCP connection
+# reestablishment.
+#
+# Possible values:
+# * Positive integer value representing time in seconds
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 1
+#tcp_keepidle = 600
+
+#
+# Absolute path to the CA file.
+#
+# Provide a string value representing a valid absolute path to
+# the Certificate Authority file to use for client authentication.
+#
+# A CA file typically contains necessary trusted certificates to
+# use for the client authentication. This is essential to ensure
+# that a secure connection is established to the server via the
+# internet.
+#
+# Possible values:
+# * Valid absolute path to the CA file
+#
+# Related options:
+# * None
+#
+# (string value)
+#ca_file = /etc/ssl/cafile
+
+#
+# Absolute path to the certificate file.
+#
+# Provide a string value representing a valid absolute path to the
+# certificate file which is required to start the API service
+# securely.
+#
+# A certificate file typically is a public key container and includes
+# the server's public key, server name, server information and the
+# signature which was a result of the verification process using the
+# CA certificate. This is required for a secure connection
+# establishment.
+#
+# Possible values:
+# * Valid absolute path to the certificate file
+#
+# Related options:
+# * None
+#
+# (string value)
+#cert_file = /etc/ssl/certs
+
+#
+# Absolute path to a private key file.
+#
+# Provide a string value representing a valid absolute path to a
+# private key file which is required to establish the client-server
+# connection.
+#
+# Possible values:
+# * Absolute path to the private key file
+#
+# Related options:
+# * None
+#
+# (string value)
+#key_file = /etc/ssl/key/key-file.pem
+
+# DEPRECATED: The HTTP header used to determine the scheme for the
+# original request, even if it was removed by an SSL terminating
+# proxy. Typical value is "HTTP_X_FORWARDED_PROTO". (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: Use the http_proxy_to_wsgi middleware instead.
+#secure_proxy_ssl_header = <None>
+
+#
+# The relative path to sqlite file database that will be used for
+# image cache
+# management.
+#
+# This is a relative path to the sqlite file database that tracks the
+# age and
+# usage statistics of image cache. The path is relative to image cache
+# base
+# directory, specified by the configuration option
+# ``image_cache_dir``.
+#
+# This is a lightweight database with just one table.
+#
+# Possible values:
+# * A valid relative path to sqlite file database
+#
+# Related options:
+# * ``image_cache_dir``
+#
+# (string value)
+#image_cache_sqlite_db = cache.db
+
+#
+# The driver to use for image cache management.
+#
+# This configuration option provides the flexibility to choose between
+# the
+# different image-cache drivers available. An image-cache driver is
+# responsible
+# for providing the essential functions of image-cache like write
+# images to/read
+# images from cache, track age and usage of cached images, provide a
+# list of
+# cached images, fetch size of the cache, queue images for caching and
+# clean up
+# the cache, etc.
+#
+# The essential functions of a driver are defined in the base class
+# ``glance.image_cache.drivers.base.Driver``. All image-cache drivers
+# (existing
+# and prospective) must implement this interface. Currently available
+# drivers
+# are ``sqlite`` and ``xattr``. These drivers primarily differ in the
+# way they
+# store the information about cached images:
+# * The ``sqlite`` driver uses a sqlite database (which sits on
+# every glance
+# node locally) to track the usage of cached images.
+# * The ``xattr`` driver uses the extended attributes of files to
+# store this
+# information. It also requires a filesystem that sets ``atime``
+# on the files
+# when accessed.
+#
+# Possible values:
+# * sqlite
+# * xattr
+#
+# Related options:
+# * None
+#
+# (string value)
+# Possible values:
+# sqlite - <No description provided>
+# xattr - <No description provided>
+#image_cache_driver = sqlite
+
+#
+# The upper limit on cache size, in bytes, after which the cache-
+# pruner cleans
+# up the image cache.
+#
+# NOTE: This is just a threshold for cache-pruner to act upon. It is
+# NOT a
+# hard limit beyond which the image cache would never grow. In fact,
+# depending
+# on how often the cache-pruner runs and how quickly the cache fills,
+# the image
+# cache can far exceed the size specified here very easily. Hence,
+# care must be
+# taken to appropriately schedule the cache-pruner and in setting this
+# limit.
+#
+# Glance caches an image when it is downloaded. Consequently, the size
+# of the
+# image cache grows over time as the number of downloads increases. To
+# keep the
+# cache size from becoming unmanageable, it is recommended to run the
+# cache-pruner as a periodic task. When the cache pruner is kicked
+# off, it
+# compares the current size of image cache and triggers a cleanup if
+# the image
+# cache grew beyond the size specified here. After the cleanup, the
+# size of
+# cache is less than or equal to size specified here.
+#
+# Possible values:
+# * Any non-negative integer
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+#image_cache_max_size = 10737418240
+{% if server.get('image_cache', {}).get('enabled', False) %}
+
+image_cache_max_size = {{ server.image_cache.get('max_size', '10737418240') }}
+image_cache_stall_time = {{ server.image_cache.get('stall_time', '86400') }}
+image_cache_dir = {{ server.image_cache.get('directory', '/var/lib/glance/image-cache/') }}
+{% endif %}
+
+#
+# The amount of time, in seconds, an incomplete image remains in the
+# cache.
+#
+# Incomplete images are images for which download is in progress.
+# Please see the
+# description of configuration option ``image_cache_dir`` for more
+# detail.
+# Sometimes, due to various reasons, it is possible the download may
+# hang and
+# the incompletely downloaded image remains in the ``incomplete``
+# directory.
+# This configuration option sets a time limit on how long the
+# incomplete images
+# should remain in the ``incomplete`` directory before they are
+# cleaned up.
+# Once an incomplete image spends more time than is specified here,
+# it'll be
+# removed by cache-cleaner on its next run.
+#
+# It is recommended to run cache-cleaner as a periodic task on the
+# Glance API
+# nodes to keep the incomplete images from occupying disk space.
+#
+# Possible values:
+# * Any non-negative integer
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+#image_cache_stall_time = 86400
+
+#
+# Base directory for image cache.
+#
+# This is the location where image data is cached and served out of.
+# All cached
+# images are stored directly under this directory. This directory also
+# contains
+# three subdirectories, namely, ``incomplete``, ``invalid`` and
+# ``queue``.
+#
+# The ``incomplete`` subdirectory is the staging area for downloading
+# images. An
+# image is first downloaded to this directory. When the image download
+# is
+# successful it is moved to the base directory. However, if the
+# download fails,
+# the partially downloaded image file is moved to the ``invalid``
+# subdirectory.
+#
+# The ``queue``subdirectory is used for queuing images for download.
+# This is
+# used primarily by the cache-prefetcher, which can be scheduled as a
+# periodic
+# task like cache-pruner and cache-cleaner, to cache images ahead of
+# their usage.
+# Upon receiving the request to cache an image, Glance touches a file
+# in the
+# ``queue`` directory with the image id as the file name. The cache-
+# prefetcher,
+# when running, polls for the files in ``queue`` directory and starts
+# downloading them in the order they were created. When the download
+# is
+# successful, the zero-sized file is deleted from the ``queue``
+# directory.
+# If the download fails, the zero-sized file remains and it'll be
+# retried the
+# next time cache-prefetcher runs.
+#
+# Possible values:
+# * A valid path
+#
+# Related options:
+# * ``image_cache_sqlite_db``
+#
+# (string value)
+#image_cache_dir = <None>
+
+#
+# Default publisher_id for outgoing Glance notifications.
+#
+# This is the value that the notification driver will use to identify
+# messages for events originating from the Glance service. Typically,
+# this is the hostname of the instance that generated the message.
+#
+# Possible values:
+# * Any reasonable instance identifier, for example: image.host1
+#
+# Related options:
+# * None
+#
+# (string value)
+#default_publisher_id = image.localhost
+
+#
+# List of notifications to be disabled.
+#
+# Specify a list of notifications that should not be emitted.
+# A notification can be given either as a notification type to
+# disable a single event notification, or as a notification group
+# prefix to disable all event notifications within a group.
+#
+# Possible values:
+# A comma-separated list of individual notification types or
+# notification groups to be disabled. Currently supported groups:
+# * image
+# * image.member
+# * task
+# * metadef_namespace
+# * metadef_object
+# * metadef_property
+# * metadef_resource_type
+# * metadef_tag
+# For a complete listing and description of each event refer to:
+# http://docs.openstack.org/developer/glance/notifications.html
+#
+# The values must be specified as: <group_name>.<event_name>
+# For example: image.create,task.success,metadef_tag
+#
+# Related options:
+# * None
+#
+# (list value)
+#disabled_notifications =
+
+# DEPRECATED:
+# Address the registry server is hosted on.
+#
+# Possible values:
+# * A valid IP or hostname
+#
+# Related options:
+# * None
+#
+# (unknown value)
+# This option is deprecated for removal since Queens.
+# Its value may be silently ignored in the future.
+# Reason:
+# Glance registry service is deprecated for removal.
+#
+# More information can be found from the spec:
+# http://specs.openstack.org/openstack/glance-
+# specs/specs/queens/approved/glance/deprecate-registry.html
+#registry_host = 0.0.0.0
+registry_host = {{ server.registry.host }}
+
+# DEPRECATED:
+# Port the registry server is listening on.
+#
+# Possible values:
+# * A valid port number
+#
+# Related options:
+# * None
+#
+# (port value)
+# Minimum value: 0
+# Maximum value: 65535
+# This option is deprecated for removal since Queens.
+# Its value may be silently ignored in the future.
+# Reason:
+# Glance registry service is deprecated for removal.
+#
+# More information can be found from the spec:
+# http://specs.openstack.org/openstack/glance-
+# specs/specs/queens/approved/glance/deprecate-registry.html
+#registry_port = 9191
+registry_port = {{ server.registry.port }}
+
+# DEPRECATED: Whether to pass through the user token when making
+# requests to the registry. To prevent failures with token expiration
+# during big files upload, it is recommended to set this parameter to
+# False.If "use_user_token" is not in effect, then admin credentials
+# can be specified. (boolean value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: This option was considered harmful and has been deprecated
+# in M release. It will be removed in O release. For more information
+# read OSSN-0060. Related functionality with uploading big images has
+# been implemented with Keystone trusts support.
+#use_user_token = true
+
+# DEPRECATED: The administrators user name. If "use_user_token" is not
+# in effect, then admin credentials can be specified. (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: This option was considered harmful and has been deprecated
+# in M release. It will be removed in O release. For more information
+# read OSSN-0060. Related functionality with uploading big images has
+# been implemented with Keystone trusts support.
+#admin_user = <None>
+
+# DEPRECATED: The administrators password. If "use_user_token" is not
+# in effect, then admin credentials can be specified. (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: This option was considered harmful and has been deprecated
+# in M release. It will be removed in O release. For more information
+# read OSSN-0060. Related functionality with uploading big images has
+# been implemented with Keystone trusts support.
+#admin_password = <None>
+
+# DEPRECATED: The tenant name of the administrative user. If
+# "use_user_token" is not in effect, then admin tenant name can be
+# specified. (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: This option was considered harmful and has been deprecated
+# in M release. It will be removed in O release. For more information
+# read OSSN-0060. Related functionality with uploading big images has
+# been implemented with Keystone trusts support.
+#admin_tenant_name = <None>
+
+# DEPRECATED: The URL to the keystone service. If "use_user_token" is
+# not in effect and using keystone auth, then URL of keystone can be
+# specified. (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: This option was considered harmful and has been deprecated
+# in M release. It will be removed in O release. For more information
+# read OSSN-0060. Related functionality with uploading big images has
+# been implemented with Keystone trusts support.
+#auth_url = <None>
+
+# DEPRECATED: The strategy to use for authentication. If
+# "use_user_token" is not in effect, then auth strategy can be
+# specified. (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: This option was considered harmful and has been deprecated
+# in M release. It will be removed in O release. For more information
+# read OSSN-0060. Related functionality with uploading big images has
+# been implemented with Keystone trusts support.
+#auth_strategy = noauth
+
+# DEPRECATED: The region for the authentication service. If
+# "use_user_token" is not in effect and using keystone auth, then
+# region name can be specified. (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: This option was considered harmful and has been deprecated
+# in M release. It will be removed in O release. For more information
+# read OSSN-0060. Related functionality with uploading big images has
+# been implemented with Keystone trusts support.
+#auth_region = <None>
+#{% if server.identity.region is defined %}
+#auth_region = {{ server.identity.region }}
+#{% endif %}
+
+# DEPRECATED:
+# Protocol to use for communication with the registry server.
+#
+# Provide a string value representing the protocol to use for
+# communication with the registry server. By default, this option is
+# set to ``http`` and the connection is not secure.
+#
+# This option can be set to ``https`` to establish a secure connection
+# to the registry server. In this case, provide a key to use for the
+# SSL connection using the ``registry_client_key_file`` option. Also
+# include the CA file and cert file using the options
+# ``registry_client_ca_file`` and ``registry_client_cert_file``
+# respectively.
+#
+# Possible values:
+# * http
+# * https
+#
+# Related options:
+# * registry_client_key_file
+# * registry_client_cert_file
+# * registry_client_ca_file
+#
+# (string value)
+# Possible values:
+# http - <No description provided>
+# https - <No description provided>
+# This option is deprecated for removal since Queens.
+# Its value may be silently ignored in the future.
+# Reason:
+# Glance registry service is deprecated for removal.
+#
+# More information can be found from the spec:
+# http://specs.openstack.org/openstack/glance-
+# specs/specs/queens/approved/glance/deprecate-registry.html
+#registry_client_protocol = http
+#registry_client_protocol = {{ server.registry.get('protocol', 'http') }}
+
+# DEPRECATED:
+# Absolute path to the private key file.
+#
+# Provide a string value representing a valid absolute path to the
+# private key file to use for establishing a secure connection to
+# the registry server.
+#
+# NOTE: This option must be set if ``registry_client_protocol`` is
+# set to ``https``. Alternatively, the GLANCE_CLIENT_KEY_FILE
+# environment variable may be set to a filepath of the key file.
+#
+# Possible values:
+# * String value representing a valid absolute path to the key
+# file.
+#
+# Related options:
+# * registry_client_protocol
+#
+# (string value)
+# This option is deprecated for removal since Queens.
+# Its value may be silently ignored in the future.
+# Reason:
+# Glance registry service is deprecated for removal.
+#
+# More information can be found from the spec:
+# http://specs.openstack.org/openstack/glance-
+# specs/specs/queens/approved/glance/deprecate-registry.html
+#registry_client_key_file = /etc/ssl/key/key-file.pem
+
+# DEPRECATED:
+# Absolute path to the certificate file.
+#
+# Provide a string value representing a valid absolute path to the
+# certificate file to use for establishing a secure connection to
+# the registry server.
+#
+# NOTE: This option must be set if ``registry_client_protocol`` is
+# set to ``https``. Alternatively, the GLANCE_CLIENT_CERT_FILE
+# environment variable may be set to a filepath of the certificate
+# file.
+#
+# Possible values:
+# * String value representing a valid absolute path to the
+# certificate file.
+#
+# Related options:
+# * registry_client_protocol
+#
+# (string value)
+# This option is deprecated for removal since Queens.
+# Its value may be silently ignored in the future.
+# Reason:
+# Glance registry service is deprecated for removal.
+#
+# More information can be found from the spec:
+# http://specs.openstack.org/openstack/glance-
+# specs/specs/queens/approved/glance/deprecate-registry.html
+#registry_client_cert_file = /etc/ssl/certs/file.crt
+
+# DEPRECATED:
+# Absolute path to the Certificate Authority file.
+#
+# Provide a string value representing a valid absolute path to the
+# certificate authority file to use for establishing a secure
+# connection to the registry server.
+#
+# NOTE: This option must be set if ``registry_client_protocol`` is
+# set to ``https``. Alternatively, the GLANCE_CLIENT_CA_FILE
+# environment variable may be set to a filepath of the CA file.
+# This option is ignored if the ``registry_client_insecure`` option
+# is set to ``True``.
+#
+# Possible values:
+# * String value representing a valid absolute path to the CA
+# file.
+#
+# Related options:
+# * registry_client_protocol
+# * registry_client_insecure
+#
+# (string value)
+# This option is deprecated for removal since Queens.
+# Its value may be silently ignored in the future.
+# Reason:
+# Glance registry service is deprecated for removal.
+#
+# More information can be found from the spec:
+# http://specs.openstack.org/openstack/glance-
+# specs/specs/queens/approved/glance/deprecate-registry.html
+#registry_client_ca_file = /etc/ssl/cafile/file.ca
+#{%- if server.registry.get('protocol', 'http') == 'https' %}
+#registry_client_ca_file = {{ server.registry.get('cacert_file', server.cacert_file) }}
+#{%- endif %}
+
+# DEPRECATED:
+# Set verification of the registry server certificate.
+#
+# Provide a boolean value to determine whether or not to validate
+# SSL connections to the registry server. By default, this option
+# is set to ``False`` and the SSL connections are validated.
+#
+# If set to ``True``, the connection to the registry server is not
+# validated via a certifying authority and the
+# ``registry_client_ca_file`` option is ignored. This is the
+# registry's equivalent of specifying --insecure on the command line
+# using glanceclient for the API.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * registry_client_protocol
+# * registry_client_ca_file
+#
+# (boolean value)
+# This option is deprecated for removal since Queens.
+# Its value may be silently ignored in the future.
+# Reason:
+# Glance registry service is deprecated for removal.
+#
+# More information can be found from the spec:
+# http://specs.openstack.org/openstack/glance-
+# specs/specs/queens/approved/glance/deprecate-registry.html
+#registry_client_insecure = false
+
+# DEPRECATED:
+# Timeout value for registry requests.
+#
+# Provide an integer value representing the period of time in seconds
+# that the API server will wait for a registry request to complete.
+# The default value is 600 seconds.
+#
+# A value of 0 implies that a request will never timeout.
+#
+# Possible values:
+# * Zero
+# * Positive integer
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+# This option is deprecated for removal since Queens.
+# Its value may be silently ignored in the future.
+# Reason:
+# Glance registry service is deprecated for removal.
+#
+# More information can be found from the spec:
+# http://specs.openstack.org/openstack/glance-
+# specs/specs/queens/approved/glance/deprecate-registry.html
+#registry_client_timeout = 600
+
+#
+# Send headers received from identity when making requests to
+# registry.
+#
+# Typically, Glance registry can be deployed in multiple flavors,
+# which may or may not include authentication. For example,
+# ``trusted-auth`` is a flavor that does not require the registry
+# service to authenticate the requests it receives. However, the
+# registry service may still need a user context to be populated to
+# serve the requests. This can be achieved by the caller
+# (the Glance API usually) passing through the headers it received
+# from authenticating with identity for the same request. The typical
+# headers sent are ``X-User-Id``, ``X-Tenant-Id``, ``X-Roles``,
+# ``X-Identity-Status`` and ``X-Service-Catalog``.
+#
+# Provide a boolean value to determine whether to send the identity
+# headers to provide tenant and user information along with the
+# requests to registry service. By default, this option is set to
+# ``False``, which means that user and tenant information is not
+# available readily. It must be obtained by authenticating. Hence, if
+# this is set to ``False``, ``flavor`` must be set to value that
+# either includes authentication or authenticated user context.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * flavor
+#
+# (boolean value)
+#send_identity_headers = false
+
+#
+# The amount of time, in seconds, to delay image scrubbing.
+#
+# When delayed delete is turned on, an image is put into
+# ``pending_delete``
+# state upon deletion until the scrubber deletes its image data.
+# Typically, soon
+# after the image is put into ``pending_delete`` state, it is
+# available for
+# scrubbing. However, scrubbing can be delayed until a later point
+# using this
+# configuration option. This option denotes the time period an image
+# spends in
+# ``pending_delete`` state before it is available for scrubbing.
+#
+# It is important to realize that this has storage implications. The
+# larger the
+# ``scrub_time``, the longer the time to reclaim backend storage from
+# deleted
+# images.
+#
+# Possible values:
+# * Any non-negative integer
+#
+# Related options:
+# * ``delayed_delete``
+#
+# (integer value)
+# Minimum value: 0
+#scrub_time = 0
+
+#
+# The size of thread pool to be used for scrubbing images.
+#
+# When there are a large number of images to scrub, it is beneficial
+# to scrub
+# images in parallel so that the scrub queue stays in control and the
+# backend
+# storage is reclaimed in a timely fashion. This configuration option
+# denotes
+# the maximum number of images to be scrubbed in parallel. The default
+# value is
+# one, which signifies serial scrubbing. Any value above one indicates
+# parallel
+# scrubbing.
+#
+# Possible values:
+# * Any non-zero positive integer
+#
+# Related options:
+# * ``delayed_delete``
+#
+# (integer value)
+# Minimum value: 1
+#scrub_pool_size = 1
+
+#
+# Turn on/off delayed delete.
+#
+# Typically when an image is deleted, the ``glance-api`` service puts
+# the image
+# into ``deleted`` state and deletes its data at the same time.
+# Delayed delete
+# is a feature in Glance that delays the actual deletion of image data
+# until a
+# later point in time (as determined by the configuration option
+# ``scrub_time``).
+# When delayed delete is turned on, the ``glance-api`` service puts
+# the image
+# into ``pending_delete`` state upon deletion and leaves the image
+# data in the
+# storage backend for the image scrubber to delete at a later time.
+# The image
+# scrubber will move the image into ``deleted`` state upon successful
+# deletion
+# of image data.
+#
+# NOTE: When delayed delete is turned on, image scrubber MUST be
+# running as a
+# periodic task to prevent the backend storage from filling up with
+# undesired
+# usage.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * ``scrub_time``
+# * ``wakeup_time``
+# * ``scrub_pool_size``
+#
+# (boolean value)
+#delayed_delete = false
+
+{%- if server.logging is defined %}
+{%- set _data = server.logging %}
+{%- include "oslo_templates/files/queens/oslo/_log.conf" %}
+{%- endif %}
+
+[image_format]
+
+#
+# From glance.api
+#
+
+# Supported values for the 'container_format' image attribute (list
+# value)
+# Deprecated group/name - [DEFAULT]/container_formats
+#container_formats = ami,ari,aki,bare,ovf,ova,docker
+
+# Supported values for the 'disk_format' image attribute (list value)
+# Deprecated group/name - [DEFAULT]/disk_formats
+#disk_formats = ami,ari,aki,vhd,vhdx,vmdk,raw,qcow2,vdi,iso,ploop,root-tar
+
+
+[paste_deploy]
+
+#
+# From glance.api
+#
+
+#
+# Deployment flavor to use in the server application pipeline.
+#
+# Provide a string value representing the appropriate deployment
+# flavor used in the server application pipleline. This is typically
+# the partial name of a pipeline in the paste configuration file with
+# the service name removed.
+#
+# For example, if your paste section name in the paste configuration
+# file is [pipeline:glance-api-keystone], set ``flavor`` to
+# ``keystone``.
+#
+# Possible values:
+# * String value representing a partial pipeline name.
+#
+# Related Options:
+# * config_file
+#
+# (string value)
+#flavor = keystone
+flavor = keystone
+
+#
+# Name of the paste configuration file.
+#
+# Provide a string value representing the name of the paste
+# configuration file to use for configuring piplelines for
+# server application deployments.
+#
+# NOTES:
+# * Provide the name or the path relative to the glance directory
+# for the paste configuration file and not the absolute path.
+# * The sample paste configuration file shipped with Glance need
+# not be edited in most cases as it comes with ready-made
+# pipelines for all common deployment flavors.
+#
+# If no value is specified for this option, the ``paste.ini`` file
+# with the prefix of the corresponding Glance service's configuration
+# file name will be searched for in the known configuration
+# directories. (For example, if this option is missing from or has no
+# value set in ``glance-api.conf``, the service will look for a file
+# named ``glance-api-paste.ini``.) If the paste configuration file is
+# not found, the service will not start.
+#
+# Possible values:
+# * A string value representing the name of the paste
+# configuration
+# file.
+#
+# Related Options:
+# * flavor
+#
+# (string value)
+#config_file = glance-api-paste.ini
+
+
+[profiler]
+
+#
+# From glance.api
+#
+
+#
+# Enables the profiling for all services on this node. Default value
+# is False
+# (fully disable the profiling feature).
+#
+# Possible values:
+#
+# * True: Enables the feature
+# * False: Disables the feature. The profiling cannot be started via
+# this project
+# operations. If the profiling is triggered by another project, this
+# project part
+# will be empty.
+# (boolean value)
+# Deprecated group/name - [profiler]/profiler_enabled
+#enabled = false
+
+#
+# Enables SQL requests profiling in services. Default value is False
+# (SQL
+# requests won't be traced).
+#
+# Possible values:
+#
+# * True: Enables SQL requests profiling. Each SQL query will be part
+# of the
+# trace and can the be analyzed by how much time was spent for that.
+# * False: Disables SQL requests profiling. The spent time is only
+# shown on a
+# higher level of operations. Single SQL queries cannot be analyzed
+# this
+# way.
+# (boolean value)
+#trace_sqlalchemy = false
+
+#
+# Secret key(s) to use for encrypting context data for performance
+# profiling.
+# This string value should have the following format:
+# <key1>[,<key2>,...<keyn>],
+# where each key is some random string. A user who triggers the
+# profiling via
+# the REST API has to set one of these keys in the headers of the REST
+# API call
+# to include profiling results of this node for this particular
+# project.
+#
+# Both "enabled" flag and "hmac_keys" config options should be set to
+# enable
+# profiling. Also, to generate correct profiling information across
+# all services
+# at least one key needs to be consistent between OpenStack projects.
+# This
+# ensures it can be used from client side to generate the trace,
+# containing
+# information from all possible resources. (string value)
+#hmac_keys = SECRET_KEY
+
+#
+# Connection string for a notifier backend. Default value is
+# messaging:// which
+# sets the notifier to oslo_messaging.
+#
+# Examples of possible values:
+#
+# * messaging://: use oslo_messaging driver for sending notifications.
+# * mongodb://127.0.0.1:27017 : use mongodb driver for sending
+# notifications.
+# * elasticsearch://127.0.0.1:9200 : use elasticsearch driver for
+# sending
+# notifications.
+# (string value)
+#connection_string = messaging://
+
+#
+# Document type for notification indexing in elasticsearch.
+# (string value)
+#es_doc_type = notification
+
+#
+# This parameter is a time value parameter (for example:
+# es_scroll_time=2m),
+# indicating for how long the nodes that participate in the search
+# will maintain
+# relevant resources in order to continue and support it.
+# (string value)
+#es_scroll_time = 2m
+
+#
+# Elasticsearch splits large requests in batches. This parameter
+# defines
+# maximum size of each batch (for example: es_scroll_size=10000).
+# (integer value)
+#es_scroll_size = 10000
+
+#
+# Redissentinel provides a timeout option on the connections.
+# This parameter defines that timeout (for example:
+# socket_timeout=0.1).
+# (floating point value)
+#socket_timeout = 0.1
+
+#
+# Redissentinel uses a service name to identify a master redis
+# service.
+# This parameter defines the name (for example:
+# sentinal_service_name=mymaster).
+# (string value)
+#sentinel_service_name = mymaster
+
+
+[store_type_location_strategy]
+
+#
+# From glance.api
+#
+
+#
+# Preference order of storage backends.
+#
+# Provide a comma separated list of store names in the order in
+# which images should be retrieved from storage backends.
+# These store names must be registered with the ``stores``
+# configuration option.
+#
+# NOTE: The ``store_type_preference`` configuration option is applied
+# only if ``store_type`` is chosen as a value for the
+# ``location_strategy`` configuration option. An empty list will not
+# change the location order.
+#
+# Possible values:
+# * Empty list
+# * Comma separated list of registered store names. Legal values
+# are:
+# * file
+# * http
+# * rbd
+# * swift
+# * sheepdog
+# * cinder
+# * vmware
+#
+# Related options:
+# * location_strategy
+# * stores
+#
+# (list value)
+#store_type_preference =
+
+
+[task]
+
+#
+# From glance.api
+#
+
+# Time in hours for which a task lives after, either succeeding or
+# failing (integer value)
+# Deprecated group/name - [DEFAULT]/task_time_to_live
+#task_time_to_live = 48
+
+#
+# Task executor to be used to run task scripts.
+#
+# Provide a string value representing the executor to use for task
+# executions. By default, ``TaskFlow`` executor is used.
+#
+# ``TaskFlow`` helps make task executions easy, consistent, scalable
+# and reliable. It also enables creation of lightweight task objects
+# and/or functions that are combined together into flows in a
+# declarative manner.
+#
+# Possible values:
+# * taskflow
+#
+# Related Options:
+# * None
+#
+# (string value)
+#task_executor = taskflow
+
+#
+# Absolute path to the work directory to use for asynchronous
+# task operations.
+#
+# The directory set here will be used to operate over images -
+# normally before they are imported in the destination store.
+#
+# NOTE: When providing a value for ``work_dir``, please make sure
+# that enough space is provided for concurrent tasks to run
+# efficiently without running out of space.
+#
+# A rough estimation can be done by multiplying the number of
+# ``max_workers`` with an average image size (e.g 500MB). The image
+# size estimation should be done based on the average size in your
+# deployment. Note that depending on the tasks running you may need
+# to multiply this number by some factor depending on what the task
+# does. For example, you may want to double the available size if
+# image conversion is enabled. All this being said, remember these
+# are just estimations and you should do them based on the worst
+# case scenario and be prepared to act in case they were wrong.
+#
+# Possible values:
+# * String value representing the absolute path to the working
+# directory
+#
+# Related Options:
+# * None
+#
+# (string value)
+#work_dir = /work_dir
+
+
+[taskflow_executor]
+
+#
+# From glance.api
+#
+
+#
+# Set the taskflow engine mode.
+#
+# Provide a string type value to set the mode in which the taskflow
+# engine would schedule tasks to the workers on the hosts. Based on
+# this mode, the engine executes tasks either in single or multiple
+# threads. The possible values for this configuration option are:
+# ``serial`` and ``parallel``. When set to ``serial``, the engine runs
+# all the tasks in a single thread which results in serial execution
+# of tasks. Setting this to ``parallel`` makes the engine run tasks in
+# multiple threads. This results in parallel execution of tasks.
+#
+# Possible values:
+# * serial
+# * parallel
+#
+# Related options:
+# * max_workers
+#
+# (string value)
+# Possible values:
+# serial - <No description provided>
+# parallel - <No description provided>
+#engine_mode = parallel
+
+#
+# Set the number of engine executable tasks.
+#
+# Provide an integer value to limit the number of workers that can be
+# instantiated on the hosts. In other words, this number defines the
+# number of parallel tasks that can be executed at the same time by
+# the taskflow engine. This value can be greater than one when the
+# engine mode is set to parallel.
+#
+# Possible values:
+# * Integer value greater than or equal to 1
+#
+# Related options:
+# * engine_mode
+#
+# (integer value)
+# Minimum value: 1
+# Deprecated group/name - [task]/eventlet_executor_pool_size
+#max_workers = 10
+
+#
+# Set the desired image conversion format.
+#
+# Provide a valid image format to which you want images to be
+# converted before they are stored for consumption by Glance.
+# Appropriate image format conversions are desirable for specific
+# storage backends in order to facilitate efficient handling of
+# bandwidth and usage of the storage infrastructure.
+#
+# By default, ``conversion_format`` is not set and must be set
+# explicitly in the configuration file.
+#
+# The allowed values for this option are ``raw``, ``qcow2`` and
+# ``vmdk``. The ``raw`` format is the unstructured disk format and
+# should be chosen when RBD or Ceph storage backends are used for
+# image storage. ``qcow2`` is supported by the QEMU emulator that
+# expands dynamically and supports Copy on Write. The ``vmdk`` is
+# another common disk format supported by many common virtual machine
+# monitors like VMWare Workstation.
+#
+# Possible values:
+# * qcow2
+# * raw
+# * vmdk
+#
+# Related options:
+# * disk_formats
+#
+# (string value)
+# Possible values:
+# qcow2 - <No description provided>
+# raw - <No description provided>
+# vmdk - <No description provided>
+#conversion_format = raw
+
+[glance_store]
+
+#
+# From glance.store
+#
+
+#
+# List of enabled Glance stores.
+#
+# Register the storage backends to use for storing disk images
+# as a comma separated list. The default stores enabled for
+# storing disk images with Glance are ``file`` and ``http``.
+#
+# Possible values:
+# * A comma separated list that could include:
+# * file
+# * http
+# * swift
+# * rbd
+# * sheepdog
+# * cinder
+# * vmware
+#
+# Related Options:
+# * default_store
+#
+# (list value)
+#stores = file,http
+
+#
+# The default scheme to use for storing images.
+#
+# Provide a string value representing the default scheme to use for
+# storing images. If not set, Glance uses ``file`` as the default
+# scheme to store images with the ``file`` store.
+#
+# NOTE: The value given for this configuration option must be a valid
+# scheme for a store registered with the ``stores`` configuration
+# option.
+#
+# Possible values:
+# * file
+# * filesystem
+# * http
+# * https
+# * swift
+# * swift+http
+# * swift+https
+# * swift+config
+# * rbd
+# * sheepdog
+# * cinder
+# * vsphere
+#
+# Related Options:
+# * stores
+#
+# (string value)
+# Possible values:
+# file - <No description provided>
+# filesystem - <No description provided>
+# http - <No description provided>
+# https - <No description provided>
+# swift - <No description provided>
+# swift+http - <No description provided>
+# swift+https - <No description provided>
+# swift+config - <No description provided>
+# rbd - <No description provided>
+# sheepdog - <No description provided>
+# cinder - <No description provided>
+# vsphere - <No description provided>
+#default_store = file
+{%- if server.storage.default_store is defined %}
+default_store = {{ server.storage.default_store }}
+{%- endif %}
+{%- if 'file' in storage_engines %}
+stores = file,http
+{%- else %}
+ {%- if server.storage.default_store is not defined %}
+default_store = {{ storage_engines[0] }}
+ {%- endif %}
+stores = {{ server.storage.engine }}
+{%- endif %}
+
+#
+# Minimum interval in seconds to execute updating dynamic storage
+# capabilities based on current backend status.
+#
+# Provide an integer value representing time in seconds to set the
+# minimum interval before an update of dynamic storage capabilities
+# for a storage backend can be attempted. Setting
+# ``store_capabilities_update_min_interval`` does not mean updates
+# occur periodically based on the set interval. Rather, the update
+# is performed at the elapse of this interval set, if an operation
+# of the store is triggered.
+#
+# By default, this option is set to zero and is disabled. Provide an
+# integer value greater than zero to enable this option.
+#
+# NOTE: For more information on store capabilities and their updates,
+# please visit: https://specs.openstack.org/openstack/glance-
+# specs/specs/kilo/store-capabilities.html
+#
+# For more information on setting up a particular store in your
+# deployment and help with the usage of this feature, please contact
+# the storage driver maintainers listed here:
+# http://docs.openstack.org/developer/glance_store/drivers/index.html
+#
+# Possible values:
+# * Zero
+# * Positive integer
+#
+# Related Options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+#store_capabilities_update_min_interval = 0
+
+#
+# Information to match when looking for cinder in the service catalog.
+#
+# When the ``cinder_endpoint_template`` is not set and any of
+# ``cinder_store_auth_address``, ``cinder_store_user_name``,
+# ``cinder_store_project_name``, ``cinder_store_password`` is not set,
+# cinder store uses this information to lookup cinder endpoint from
+# the service
+# catalog in the current context. ``cinder_os_region_name``, if set,
+# is taken
+# into consideration to fetch the appropriate endpoint.
+#
+# The service catalog can be listed by the ``openstack catalog list``
+# command.
+#
+# Possible values:
+# * A string of of the following form:
+# ``<service_type>:<service_name>:<interface>``
+# At least ``service_type`` and ``interface`` should be
+# specified.
+# ``service_name`` can be omitted.
+#
+# Related options:
+# * cinder_os_region_name
+# * cinder_endpoint_template
+# * cinder_store_auth_address
+# * cinder_store_user_name
+# * cinder_store_project_name
+# * cinder_store_password
+#
+# (string value)
+#cinder_catalog_info = volumev2::publicURL
+cinder_catalog_info = volumev2::{{ server.identity.get('endpoint_type', 'publicURL') }}
+
+#
+# Override service catalog lookup with template for cinder endpoint.
+#
+# When this option is set, this value is used to generate cinder
+# endpoint,
+# instead of looking up from the service catalog.
+# This value is ignored if ``cinder_store_auth_address``,
+# ``cinder_store_user_name``, ``cinder_store_project_name``, and
+# ``cinder_store_password`` are specified.
+#
+# If this configuration option is set, ``cinder_catalog_info`` will be
+# ignored.
+#
+# Possible values:
+# * URL template string for cinder endpoint, where ``%%(tenant)s``
+# is
+# replaced with the current tenant (project) name.
+# For example:
+# ``http://cinder.openstack.example.org/v2/%%(tenant)s``
+#
+# Related options:
+# * cinder_store_auth_address
+# * cinder_store_user_name
+# * cinder_store_project_name
+# * cinder_store_password
+# * cinder_catalog_info
+#
+# (string value)
+#cinder_endpoint_template = <None>
+
+#
+# Region name to lookup cinder service from the service catalog.
+#
+# This is used only when ``cinder_catalog_info`` is used for
+# determining the
+# endpoint. If set, the lookup for cinder endpoint by this node is
+# filtered to
+# the specified region. It is useful when multiple regions are listed
+# in the
+# catalog. If this is not set, the endpoint is looked up from every
+# region.
+#
+# Possible values:
+# * A string that is a valid region name.
+#
+# Related options:
+# * cinder_catalog_info
+#
+# (string value)
+# Deprecated group/name - [glance_store]/os_region_name
+#cinder_os_region_name = <None>
+{% if server.identity.region is defined %}
+cinder_os_region_name = {{ server.identity.region }}
+{% endif %}
+
+#
+# Location of a CA certificates file used for cinder client requests.
+#
+# The specified CA certificates file, if set, is used to verify cinder
+# connections via HTTPS endpoint. If the endpoint is HTTP, this value
+# is ignored.
+# ``cinder_api_insecure`` must be set to ``True`` to enable the
+# verification.
+#
+# Possible values:
+# * Path to a ca certificates file
+#
+# Related options:
+# * cinder_api_insecure
+#
+# (string value)
+#cinder_ca_certificates_file = <None>
+{%- if 'cinder' in storage_engines and server.storage.cinder.get('protocol', 'http') == 'https' %}
+cinder_ca_certificates_file = {{ server.storage.cinder.get('cacert_file', server.cacert_file) }}
+{%- endif %}
+
+#
+# Number of cinderclient retries on failed http calls.
+#
+# When a call failed by any errors, cinderclient will retry the call
+# up to the
+# specified times after sleeping a few seconds.
+#
+# Possible values:
+# * A positive integer
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+#cinder_http_retries = 3
+
+#
+# Time period, in seconds, to wait for a cinder volume transition to
+# complete.
+#
+# When the cinder volume is created, deleted, or attached to the
+# glance node to
+# read/write the volume data, the volume's state is changed. For
+# example, the
+# newly created volume status changes from ``creating`` to
+# ``available`` after
+# the creation process is completed. This specifies the maximum time
+# to wait for
+# the status change. If a timeout occurs while waiting, or the status
+# is changed
+# to an unexpected value (e.g. `error``), the image creation fails.
+#
+# Possible values:
+# * A positive integer
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+#cinder_state_transition_timeout = 300
+
+#
+# Allow to perform insecure SSL requests to cinder.
+#
+# If this option is set to True, HTTPS endpoint connection is verified
+# using the
+# CA certificates file specified by ``cinder_ca_certificates_file``
+# option.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * cinder_ca_certificates_file
+#
+# (boolean value)
+#cinder_api_insecure = false
+
+#
+# The address where the cinder authentication service is listening.
+#
+# When all of ``cinder_store_auth_address``,
+# ``cinder_store_user_name``,
+# ``cinder_store_project_name``, and ``cinder_store_password`` options
+# are
+# specified, the specified values are always used for the
+# authentication.
+# This is useful to hide the image volumes from users by storing them
+# in a
+# project/tenant specific to the image service. It also enables users
+# to share
+# the image volume among other projects under the control of glance's
+# ACL.
+#
+# If either of these options are not set, the cinder endpoint is
+# looked up
+# from the service catalog, and current context's user and project are
+# used.
+#
+# Possible values:
+# * A valid authentication service address, for example:
+# ``http://openstack.example.org/identity/v2.0``
+#
+# Related options:
+# * cinder_store_user_name
+# * cinder_store_password
+# * cinder_store_project_name
+#
+# (string value)
+#cinder_store_auth_address = <None>
+
+#
+# User name to authenticate against cinder.
+#
+# This must be used with all the following related options. If any of
+# these are
+# not specified, the user of the current context is used.
+#
+# Possible values:
+# * A valid user name
+#
+# Related options:
+# * cinder_store_auth_address
+# * cinder_store_password
+# * cinder_store_project_name
+#
+# (string value)
+#cinder_store_user_name = <None>
+
+#
+# Password for the user authenticating against cinder.
+#
+# This must be used with all the following related options. If any of
+# these are
+# not specified, the user of the current context is used.
+#
+# Possible values:
+# * A valid password for the user specified by
+# ``cinder_store_user_name``
+#
+# Related options:
+# * cinder_store_auth_address
+# * cinder_store_user_name
+# * cinder_store_project_name
+#
+# (string value)
+#cinder_store_password = <None>
+
+#
+# Project name where the image volume is stored in cinder.
+#
+# If this configuration option is not set, the project in current
+# context is
+# used.
+#
+# This must be used with all the following related options. If any of
+# these are
+# not specified, the project of the current context is used.
+#
+# Possible values:
+# * A valid project name
+#
+# Related options:
+# * ``cinder_store_auth_address``
+# * ``cinder_store_user_name``
+# * ``cinder_store_password``
+#
+# (string value)
+#cinder_store_project_name = <None>
+
+#
+# Path to the rootwrap configuration file to use for running commands
+# as root.
+#
+# The cinder store requires root privileges to operate the image
+# volumes (for
+# connecting to iSCSI/FC volumes and reading/writing the volume data,
+# etc.).
+# The configuration file should allow the required commands by cinder
+# store and
+# os-brick library.
+#
+# Possible values:
+# * Path to the rootwrap config file
+#
+# Related options:
+# * None
+#
+# (string value)
+#rootwrap_config = /etc/glance/rootwrap.conf
+
+#
+# Volume type that will be used for volume creation in cinder.
+#
+# Some cinder backends can have several volume types to optimize
+# storage usage.
+# Adding this option allows an operator to choose a specific volume
+# type
+# in cinder that can be optimized for images.
+#
+# If this is not set, then the default volume type specified in the
+# cinder
+# configuration will be used for volume creation.
+#
+# Possible values:
+# * A valid volume type from cinder
+#
+# Related options:
+# * None
+#
+# (string value)
+#cinder_volume_type = <None>
+
+#
+# Directory to which the filesystem backend store writes images.
+#
+# Upon start up, Glance creates the directory if it doesn't already
+# exist and verifies write access to the user under which
+# ``glance-api`` runs. If the write access isn't available, a
+# ``BadStoreConfiguration`` exception is raised and the filesystem
+# store may not be available for adding new images.
+#
+# NOTE: This directory is used only when filesystem store is used as a
+# storage backend. Either ``filesystem_store_datadir`` or
+# ``filesystem_store_datadirs`` option must be specified in
+# ``glance-api.conf``. If both options are specified, a
+# ``BadStoreConfiguration`` will be raised and the filesystem store
+# may not be available for adding new images.
+#
+# Possible values:
+# * A valid path to a directory
+#
+# Related options:
+# * ``filesystem_store_datadirs``
+# * ``filesystem_store_file_perm``
+#
+# (string value)
+#filesystem_store_datadir = /var/lib/glance/images
+filesystem_store_datadir = {{ server.get('filesystem_store_datadir', '/var/lib/glance/images/') }}
+
+#
+# List of directories and their priorities to which the filesystem
+# backend store writes images.
+#
+# The filesystem store can be configured to store images in multiple
+# directories as opposed to using a single directory specified by the
+# ``filesystem_store_datadir`` configuration option. When using
+# multiple directories, each directory can be given an optional
+# priority to specify the preference order in which they should
+# be used. Priority is an integer that is concatenated to the
+# directory path with a colon where a higher value indicates higher
+# priority. When two directories have the same priority, the directory
+# with most free space is used. When no priority is specified, it
+# defaults to zero.
+#
+# More information on configuring filesystem store with multiple store
+# directories can be found at
+# http://docs.openstack.org/developer/glance/configuring.html
+#
+# NOTE: This directory is used only when filesystem store is used as a
+# storage backend. Either ``filesystem_store_datadir`` or
+# ``filesystem_store_datadirs`` option must be specified in
+# ``glance-api.conf``. If both options are specified, a
+# ``BadStoreConfiguration`` will be raised and the filesystem store
+# may not be available for adding new images.
+#
+# Possible values:
+# * List of strings of the following form:
+# * ``<a valid directory path>:<optional integer priority>``
+#
+# Related options:
+# * ``filesystem_store_datadir``
+# * ``filesystem_store_file_perm``
+#
+# (multi valued)
+#filesystem_store_datadirs =
+
+#
+# Filesystem store metadata file.
+#
+# The path to a file which contains the metadata to be returned with
+# any location associated with the filesystem store. The file must
+# contain a valid JSON object. The object should contain the keys
+# ``id`` and ``mountpoint``. The value for both keys should be a
+# string.
+#
+# Possible values:
+# * A valid path to the store metadata file
+#
+# Related options:
+# * None
+#
+# (string value)
+#filesystem_store_metadata_file = <None>
+{%- if server.filesystem_store_metadata_file is defined %}
+filesystem_store_metadata_file = {{ server.get('filesystem_store_metadata_file', '/etc/glance/filesystem_store_metadata.json') }}
+{%- endif %}
+
+#
+# File access permissions for the image files.
+#
+# Set the intended file access permissions for image data. This
+# provides
+# a way to enable other services, e.g. Nova, to consume images
+# directly
+# from the filesystem store. The users running the services that are
+# intended to be given access to could be made a member of the group
+# that owns the files created. Assigning a value less then or equal to
+# zero for this configuration option signifies that no changes be made
+# to the default permissions. This value will be decoded as an octal
+# digit.
+#
+# For more information, please refer the documentation at
+# http://docs.openstack.org/developer/glance/configuring.html
+#
+# Possible values:
+# * A valid file access permission
+# * Zero
+# * Any negative integer
+#
+# Related options:
+# * None
+#
+# (integer value)
+#filesystem_store_file_perm = 0
+
+#
+# Path to the CA bundle file.
+#
+# This configuration option enables the operator to use a custom
+# Certificate Authority file to verify the remote server certificate.
+# If
+# this option is set, the ``https_insecure`` option will be ignored
+# and
+# the CA file specified will be used to authenticate the server
+# certificate and establish a secure connection to the server.
+#
+# Possible values:
+# * A valid path to a CA file
+#
+# Related options:
+# * https_insecure
+#
+# (string value)
+#https_ca_certificates_file = <None>
+
+#
+# Set verification of the remote server certificate.
+#
+# This configuration option takes in a boolean value to determine
+# whether or not to verify the remote server certificate. If set to
+# True, the remote server certificate is not verified. If the option
+# is
+# set to False, then the default CA truststore is used for
+# verification.
+#
+# This option is ignored if ``https_ca_certificates_file`` is set.
+# The remote server certificate will then be verified using the file
+# specified using the ``https_ca_certificates_file`` option.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * https_ca_certificates_file
+#
+# (boolean value)
+#https_insecure = true
+
+#
+# The http/https proxy information to be used to connect to the remote
+# server.
+#
+# This configuration option specifies the http/https proxy information
+# that should be used to connect to the remote server. The proxy
+# information should be a key value pair of the scheme and proxy, for
+# example, http:10.0.0.1:3128. You can also specify proxies for
+# multiple
+# schemes by separating the key value pairs with a comma, for example,
+# http:10.0.0.1:3128, https:10.0.0.1:1080.
+#
+# Possible values:
+# * A comma separated list of scheme:proxy pairs as described
+# above
+#
+# Related options:
+# * None
+#
+# (dict value)
+#http_proxy_information =
+
+#
+# Size, in megabytes, to chunk RADOS images into.
+#
+# Provide an integer value representing the size in megabytes to chunk
+# Glance images into. The default chunk size is 8 megabytes. For
+# optimal
+# performance, the value should be a power of two.
+#
+# When Ceph's RBD object storage system is used as the storage backend
+# for storing Glance images, the images are chunked into objects of
+# the
+# size set using this option. These chunked objects are then stored
+# across the distributed block data store to use for Glance.
+#
+# Possible Values:
+# * Any positive integer value
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 1
+#rbd_store_chunk_size = 8
+{%- if 'rbd' in storage_engines %}
+rbd_store_chunk_size = {{ server.storage.chunk_size }}
+
+#
+# RADOS pool in which images are stored.
+#
+# When RBD is used as the storage backend for storing Glance images,
+# the
+# images are stored by means of logical grouping of the objects
+# (chunks
+# of images) into a ``pool``. Each pool is defined with the number of
+# placement groups it can contain. The default pool that is used is
+# 'images'.
+#
+# More information on the RBD storage backend can be found here:
+# http://ceph.com/planet/how-data-is-stored-in-ceph-cluster/
+#
+# Possible Values:
+# * A valid pool name
+#
+# Related options:
+# * None
+#
+# (string value)
+#rbd_store_pool = images
+rbd_store_pool = {{ server.storage.pool }}
+
+#
+# RADOS user to authenticate as.
+#
+# This configuration option takes in the RADOS user to authenticate
+# as.
+# This is only needed when RADOS authentication is enabled and is
+# applicable only if the user is using Cephx authentication. If the
+# value for this option is not set by the user or is set to None, a
+# default value will be chosen, which will be based on the client.
+# section in rbd_store_ceph_conf.
+#
+# Possible Values:
+# * A valid RADOS user
+#
+# Related options:
+# * rbd_store_ceph_conf
+#
+# (string value)
+#rbd_store_user = <None>
+rbd_store_user = {{ server.storage.user }}
+
+#
+# Ceph configuration file path.
+#
+# This configuration option takes in the path to the Ceph
+# configuration
+# file to be used. If the value for this option is not set by the user
+# or is set to None, librados will locate the default configuration
+# file
+# which is located at /etc/ceph/ceph.conf. If using Cephx
+# authentication, this file should include a reference to the right
+# keyring in a client.<USER> section
+#
+# Possible Values:
+# * A valid path to a configuration file
+#
+# Related options:
+# * rbd_store_user
+#
+# (string value)
+rbd_store_ceph_conf = /etc/ceph/ceph.conf
+
+#
+# Timeout value for connecting to Ceph cluster.
+#
+# This configuration option takes in the timeout value in seconds used
+# when connecting to the Ceph cluster i.e. it sets the time to wait
+# for
+# glance-api before closing the connection. This prevents glance-api
+# hangups during the connection to RBD. If the value for this option
+# is set to less than or equal to 0, no timeout is set and the default
+# librados value is used.
+#
+# Possible Values:
+# * Any integer value
+#
+# Related options:
+# * None
+#
+# (integer value)
+#rados_connect_timeout = 0
+{%- endif %}
+
+#
+# Chunk size for images to be stored in Sheepdog data store.
+#
+# Provide an integer value representing the size in mebibyte
+# (1048576 bytes) to chunk Glance images into. The default
+# chunk size is 64 mebibytes.
+#
+# When using Sheepdog distributed storage system, the images are
+# chunked into objects of this size and then stored across the
+# distributed data store to use for Glance.
+#
+# Chunk sizes, if a power of two, help avoid fragmentation and
+# enable improved performance.
+#
+# Possible values:
+# * Positive integer value representing size in mebibytes.
+#
+# Related Options:
+# * None
+#
+# (integer value)
+# Minimum value: 1
+#sheepdog_store_chunk_size = 64
+
+#
+# Port number on which the sheep daemon will listen.
+#
+# Provide an integer value representing a valid port number on
+# which you want the Sheepdog daemon to listen on. The default
+# port is 7000.
+#
+# The Sheepdog daemon, also called 'sheep', manages the storage
+# in the distributed cluster by writing objects across the storage
+# network. It identifies and acts on the messages it receives on
+# the port number set using ``sheepdog_store_port`` option to store
+# chunks of Glance images.
+#
+# Possible values:
+# * A valid port number (0 to 65535)
+#
+# Related Options:
+# * sheepdog_store_address
+#
+# (port value)
+# Minimum value: 0
+# Maximum value: 65535
+#sheepdog_store_port = 7000
+
+#
+# Address to bind the Sheepdog daemon to.
+#
+# Provide a string value representing the address to bind the
+# Sheepdog daemon to. The default address set for the 'sheep'
+# is 127.0.0.1.
+#
+# The Sheepdog daemon, also called 'sheep', manages the storage
+# in the distributed cluster by writing objects across the storage
+# network. It identifies and acts on the messages directed to the
+# address set using ``sheepdog_store_address`` option to store
+# chunks of Glance images.
+#
+# Possible values:
+# * A valid IPv4 address
+# * A valid IPv6 address
+# * A valid hostname
+#
+# Related Options:
+# * sheepdog_store_port
+#
+# (unknown value)
+#sheepdog_store_address = 127.0.0.1
+
+#
+# Set verification of the server certificate.
+#
+# This boolean determines whether or not to verify the server
+# certificate. If this option is set to True, swiftclient won't check
+# for a valid SSL certificate when authenticating. If the option is
+# set
+# to False, then the default CA truststore is used for verification.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * swift_store_cacert
+#
+# (boolean value)
+#swift_store_auth_insecure = false
+{%- if 'swift' in storage_engines %}
+swift_store_auth_insecure = {{ server.storage.swift.store.get('auth', {}).get('insecure', False)|lower }}
+
+#
+# Path to the CA bundle file.
+#
+# This configuration option enables the operator to specify the path
+# to
+# a custom Certificate Authority file for SSL verification when
+# connecting to Swift.
+#
+# Possible values:
+# * A valid path to a CA file
+#
+# Related options:
+# * swift_store_auth_insecure
+#
+# (string value)
+#swift_store_cacert = /etc/ssl/certs/ca-certificates.crt
+{% if server.storage.swift.store.cacert is defined %}
+swift_store_cacert = {{ server.storage.swift.store.cacert }}
+{% endif %}
+
+#
+# The region of Swift endpoint to use by Glance.
+#
+# Provide a string value representing a Swift region where Glance
+# can connect to for image storage. By default, there is no region
+# set.
+#
+# When Glance uses Swift as the storage backend to store images
+# for a specific tenant that has multiple endpoints, setting of a
+# Swift region with ``swift_store_region`` allows Glance to connect
+# to Swift in the specified region as opposed to a single region
+# connectivity.
+#
+# This option can be configured for both single-tenant and
+# multi-tenant storage.
+#
+# NOTE: Setting the region with ``swift_store_region`` is
+# tenant-specific and is necessary ``only if`` the tenant has
+# multiple endpoints across different regions.
+#
+# Possible values:
+# * A string value representing a valid Swift region.
+#
+# Related Options:
+# * None
+#
+# (string value)
+#swift_store_region = RegionTwo
+{% if server.storage.swift.store.region is defined %}
+swift_store_region = {{ server.storage.swift.store.region }}
+{% endif %}
+
+#
+# The URL endpoint to use for Swift backend storage.
+#
+# Provide a string value representing the URL endpoint to use for
+# storing Glance images in Swift store. By default, an endpoint
+# is not set and the storage URL returned by ``auth`` is used.
+# Setting an endpoint with ``swift_store_endpoint`` overrides the
+# storage URL and is used for Glance image storage.
+#
+# NOTE: The URL should include the path up to, but excluding the
+# container. The location of an object is obtained by appending
+# the container and object to the configured URL.
+#
+# Possible values:
+# * String value representing a valid URL path up to a Swift
+# container
+#
+# Related Options:
+# * None
+#
+# (string value)
+#swift_store_endpoint = https://swift.openstack.example.org/v1/path_not_including_container_name
+{% if server.storage.swift.store.endpoint is defined %}
+swift_store_endpoint = {{ server.storage.swift.store.endpoint }}
+{% endif %}
+
+#
+# Endpoint Type of Swift service.
+#
+# This string value indicates the endpoint type to use to fetch the
+# Swift endpoint. The endpoint type determines the actions the user
+# will
+# be allowed to perform, for instance, reading and writing to the
+# Store.
+# This setting is only used if swift_store_auth_version is greater
+# than
+# 1.
+#
+# Possible values:
+# * publicURL
+# * adminURL
+# * internalURL
+#
+# Related options:
+# * swift_store_endpoint
+#
+# (string value)
+# Possible values:
+# publicURL - <No description provided>
+# adminURL - <No description provided>
+# internalURL - <No description provided>
+#swift_store_endpoint_type = publicURL
+swift_store_endpoint_type = {{ server.storage.swift.store.get('endpoint_type', server.identity.get('endpoint_type', 'publicURL')) }}
+
+#
+# Type of Swift service to use.
+#
+# Provide a string value representing the service type to use for
+# storing images while using Swift backend storage. The default
+# service type is set to ``object-store``.
+#
+# NOTE: If ``swift_store_auth_version`` is set to 2, the value for
+# this configuration option needs to be ``object-store``. If using
+# a higher version of Keystone or a different auth scheme, this
+# option may be modified.
+#
+# Possible values:
+# * A string representing a valid service type for Swift storage.
+#
+# Related Options:
+# * None
+#
+# (string value)
+#swift_store_service_type = object-store
+{% if server.storage.swift.store.service_type is defined %}
+swift_store_service_type = {{ server.storage.swift.store.service_type }}
+{% endif %}
+
+#
+# Name of single container to store images/name prefix for multiple
+# containers
+#
+# When a single container is being used to store images, this
+# configuration
+# option indicates the container within the Glance account to be used
+# for
+# storing all images. When multiple containers are used to store
+# images, this
+# will be the name prefix for all containers. Usage of single/multiple
+# containers can be controlled using the configuration option
+# ``swift_store_multiple_containers_seed``.
+#
+# When using multiple containers, the containers will be named after
+# the value
+# set for this configuration option with the first N chars of the
+# image UUID
+# as the suffix delimited by an underscore (where N is specified by
+# ``swift_store_multiple_containers_seed``).
+#
+# Example: if the seed is set to 3 and swift_store_container =
+# ``glance``, then
+# an image with UUID ``fdae39a1-bac5-4238-aba4-69bcc726e848`` would be
+# placed in
+# the container ``glance_fda``. All dashes in the UUID are included
+# when
+# creating the container name but do not count toward the character
+# limit, so
+# when N=10 the container name would be ``glance_fdae39a1-ba.``
+#
+# Possible values:
+# * If using single container, this configuration option can be
+# any string
+# that is a valid swift container name in Glance's Swift account
+# * If using multiple containers, this configuration option can be
+# any
+# string as long as it satisfies the container naming rules
+# enforced by
+# Swift. The value of ``swift_store_multiple_containers_seed``
+# should be
+# taken into account as well.
+#
+# Related options:
+# * ``swift_store_multiple_containers_seed``
+# * ``swift_store_multi_tenant``
+# * ``swift_store_create_container_on_put``
+#
+# (string value)
+#swift_store_container = glance
+swift_store_container = {{ server.storage.swift.store.get('container', 'glance') }}
+
+#
+# The size threshold, in MB, after which Glance will start segmenting
+# image data.
+#
+# Swift has an upper limit on the size of a single uploaded object. By
+# default,
+# this is 5GB. To upload objects bigger than this limit, objects are
+# segmented
+# into multiple smaller objects that are tied together with a manifest
+# file.
+# For more detail, refer to
+# http://docs.openstack.org/developer/swift/overview_large_objects.html
+#
+# This configuration option specifies the size threshold over which
+# the Swift
+# driver will start segmenting image data into multiple smaller files.
+# Currently, the Swift driver only supports creating Dynamic Large
+# Objects.
+#
+# NOTE: This should be set by taking into account the large object
+# limit
+# enforced by the Swift cluster in consideration.
+#
+# Possible values:
+# * A positive integer that is less than or equal to the large
+# object limit
+# enforced by the Swift cluster in consideration.
+#
+# Related options:
+# * ``swift_store_large_object_chunk_size``
+#
+# (integer value)
+# Minimum value: 1
+#swift_store_large_object_size = 5120
+{% if server.storage.swift.store.large_object_size is defined %}
+swift_store_large_object_size = {{ server.storage.swift.store.large_object_size }}
+{% endif %}
+
+#
+# The maximum size, in MB, of the segments when image data is
+# segmented.
+#
+# When image data is segmented to upload images that are larger than
+# the limit
+# enforced by the Swift cluster, image data is broken into segments
+# that are no
+# bigger than the size specified by this configuration option.
+# Refer to ``swift_store_large_object_size`` for more detail.
+#
+# For example: if ``swift_store_large_object_size`` is 5GB and
+# ``swift_store_large_object_chunk_size`` is 1GB, an image of size
+# 6.2GB will be
+# segmented into 7 segments where the first six segments will be 1GB
+# in size and
+# the seventh segment will be 0.2GB.
+#
+# Possible values:
+# * A positive integer that is less than or equal to the large
+# object limit
+# enforced by Swift cluster in consideration.
+#
+# Related options:
+# * ``swift_store_large_object_size``
+#
+# (integer value)
+# Minimum value: 1
+#swift_store_large_object_chunk_size = 200
+{% if server.storage.swift.store.large_object_chunk_size is defined %}
+swift_store_large_object_chunk_size = {{ server.storage.swift.store.large_object_chunk_size }}
+{% endif %}
+
+#
+# Create container, if it doesn't already exist, when uploading image.
+#
+# At the time of uploading an image, if the corresponding container
+# doesn't
+# exist, it will be created provided this configuration option is set
+# to True.
+# By default, it won't be created. This behavior is applicable for
+# both single
+# and multiple containers mode.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * None
+#
+# (boolean value)
+#swift_store_create_container_on_put = false
+swift_store_create_container_on_put = {{ server.storage.swift.store.get('create_container_on_put', False)|lower }}
+
+#
+# Store images in tenant's Swift account.
+#
+# This enables multi-tenant storage mode which causes Glance images to
+# be stored
+# in tenant specific Swift accounts. If this is disabled, Glance
+# stores all
+# images in its own account. More details multi-tenant store can be
+# found at
+# https://wiki.openstack.org/wiki/GlanceSwiftTenantSpecificStorage
+#
+# NOTE: If using multi-tenant swift store, please make sure
+# that you do not set a swift configuration file with the
+# 'swift_store_config_file' option.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * swift_store_config_file
+#
+# (boolean value)
+#swift_store_multi_tenant = false
+swift_store_multi_tenant = {{ server.storage.swift.store.get('multi_tenant', False)|lower }}
+
+#
+# Seed indicating the number of containers to use for storing images.
+#
+# When using a single-tenant store, images can be stored in one or
+# more than one
+# containers. When set to 0, all images will be stored in one single
+# container.
+# When set to an integer value between 1 and 32, multiple containers
+# will be
+# used to store images. This configuration option will determine how
+# many
+# containers are created. The total number of containers that will be
+# used is
+# equal to 16^N, so if this config option is set to 2, then 16^2=256
+# containers
+# will be used to store images.
+#
+# Please refer to ``swift_store_container`` for more detail on the
+# naming
+# convention. More detail about using multiple containers can be found
+# at
+# https://specs.openstack.org/openstack/glance-specs/specs/kilo/swift-
+# store-multiple-containers.html
+#
+# NOTE: This is used only when swift_store_multi_tenant is disabled.
+#
+# Possible values:
+# * A non-negative integer less than or equal to 32
+#
+# Related options:
+# * ``swift_store_container``
+# * ``swift_store_multi_tenant``
+# * ``swift_store_create_container_on_put``
+#
+# (integer value)
+# Minimum value: 0
+# Maximum value: 32
+#swift_store_multiple_containers_seed = 0
+swift_store_multiple_containers_seed = {{ server.storage.swift.store.get('multiple_containers_seed', 0) }}
+
+#
+# List of tenants that will be granted admin access.
+#
+# This is a list of tenants that will be granted read/write access on
+# all Swift containers created by Glance in multi-tenant mode. The
+# default value is an empty list.
+#
+# Possible values:
+# * A comma separated list of strings representing UUIDs of
+# Keystone
+# projects/tenants
+#
+# Related options:
+# * None
+#
+# (list value)
+#swift_store_admin_tenants =
+{% if server.storage.swift.store.admin_tenants is defined %}
+swift_store_admin_tenants = {{ server.storage.swift.store.admin_tenants }}
+{% endif %}
+
+#
+# SSL layer compression for HTTPS Swift requests.
+#
+# Provide a boolean value to determine whether or not to compress
+# HTTPS Swift requests for images at the SSL layer. By default,
+# compression is enabled.
+#
+# When using Swift as the backend store for Glance image storage,
+# SSL layer compression of HTTPS Swift requests can be set using
+# this option. If set to False, SSL layer compression of HTTPS
+# Swift requests is disabled. Disabling this option may improve
+# performance for images which are already in a compressed format,
+# for example, qcow2.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related Options:
+# * None
+#
+# (boolean value)
+#swift_store_ssl_compression = true
+swift_store_ssl_compression = {{ server.storage.swift.store.get('ssl_compression', True)|lower }}
+
+#
+# The number of times a Swift download will be retried before the
+# request fails.
+#
+# Provide an integer value representing the number of times an image
+# download must be retried before erroring out. The default value is
+# zero (no retry on a failed image download). When set to a positive
+# integer value, ``swift_store_retry_get_count`` ensures that the
+# download is attempted this many more times upon a download failure
+# before sending an error message.
+#
+# Possible values:
+# * Zero
+# * Positive integer value
+#
+# Related Options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+#swift_store_retry_get_count = 0
+{% if server.storage.swift.store.retry_get_count is defined %}
+swift_store_retry_get_count = {{ server.storage.swift.store.retry_get_count }}
+{% endif %}
+
+#
+# Time in seconds defining the size of the window in which a new
+# token may be requested before the current token is due to expire.
+#
+# Typically, the Swift storage driver fetches a new token upon the
+# expiration of the current token to ensure continued access to
+# Swift. However, some Swift transactions (like uploading image
+# segments) may not recover well if the token expires on the fly.
+#
+# Hence, by fetching a new token before the current token expiration,
+# we make sure that the token does not expire or is close to expiry
+# before a transaction is attempted. By default, the Swift storage
+# driver requests for a new token 60 seconds or less before the
+# current token expiration.
+#
+# Possible values:
+# * Zero
+# * Positive integer value
+#
+# Related Options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+#swift_store_expire_soon_interval = 60
+{% if server.storage.swift.store.expire_soon_interval is defined %}
+swift_store_expire_soon_interval = {{ server.storage.swift.store.expire_soon_interval }}
+{% endif %}
+
+#
+# Use trusts for multi-tenant Swift store.
+#
+# This option instructs the Swift store to create a trust for each
+# add/get request when the multi-tenant store is in use. Using trusts
+# allows the Swift store to avoid problems that can be caused by an
+# authentication token expiring during the upload or download of data.
+#
+# By default, ``swift_store_use_trusts`` is set to ``True``(use of
+# trusts is enabled). If set to ``False``, a user token is used for
+# the Swift connection instead, eliminating the overhead of trust
+# creation.
+#
+# NOTE: This option is considered only when
+# ``swift_store_multi_tenant`` is set to ``True``
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * swift_store_multi_tenant
+#
+# (boolean value)
+#swift_store_use_trusts = true
+{% if server.storage.swift.store.use_trusts is defined %}
+swift_store_use_trusts = {{ server.storage.swift.store.use_trusts|lower }}
+{% endif %}
+
+#
+# Buffer image segments before upload to Swift.
+#
+# Provide a boolean value to indicate whether or not Glance should
+# buffer image data to disk while uploading to swift. This enables
+# Glance to resume uploads on error.
+#
+# NOTES:
+# When enabling this option, one should take great care as this
+# increases disk usage on the API node. Be aware that depending
+# upon how the file system is configured, the disk space used
+# for buffering may decrease the actual disk space available for
+# the glance image cache. Disk utilization will cap according to
+# the following equation:
+# (``swift_store_large_object_chunk_size`` * ``workers`` * 1000)
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * swift_upload_buffer_dir
+#
+# (boolean value)
+#swift_buffer_on_upload = false
+
+#
+# Reference to default Swift account/backing store parameters.
+#
+# Provide a string value representing a reference to the default set
+# of parameters required for using swift account/backing store for
+# image storage. The default reference value for this configuration
+# option is 'ref1'. This configuration option dereferences the
+# parameters and facilitates image storage in Swift storage backend
+# every time a new image is added.
+#
+# Possible values:
+# * A valid string value
+#
+# Related options:
+# * None
+#
+# (string value)
+#default_swift_reference = ref1
+{% if server.storage.swift.store.default_swift_reference is defined %}
+default_swift_reference = {{ server.storage.swift.store.default_swift_reference }}
+{% endif %}
+
+# DEPRECATED: Version of the authentication service to use. Valid
+# versions are 2 and 3 for keystone and 1 (deprecated) for swauth and
+# rackspace. (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason:
+# The option 'auth_version' in the Swift back-end configuration file
+# is
+# used instead.
+#{% if server.storage.swift.store.get('auth', {}).get('version', False) %}
+#swift_store_auth_version = {{ server.storage.swift.store.auth.version }}
+#{% endif %}
+
+# DEPRECATED: The address where the Swift authentication service is
+# listening. (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason:
+# The option 'auth_address' in the Swift back-end configuration file
+# is
+# used instead.
+#swift_store_auth_address = <None>
+
+# DEPRECATED: The user to authenticate against the Swift
+# authentication service. (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason:
+# The option 'user' in the Swift back-end configuration file is set
+# instead.
+#{% if server.storage.swift.store.user is defined %}
+#swift_store_user = {{ server.storage.swift.store.user }}
+#{% endif %}
+
+# DEPRECATED: Auth key for the user authenticating against the Swift
+# authentication service. (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason:
+# The option 'key' in the Swift back-end configuration file is used
+# to set the authentication key instead.
+#{% if server.storage.swift.store.key is defined %}
+#swift_store_key = {{ server.storage.swift.store.key }}
+#{% endif %}
+
+#
+# Absolute path to the file containing the swift account(s)
+# configurations.
+#
+# Include a string value representing the path to a configuration
+# file that has references for each of the configured Swift
+# account(s)/backing stores. By default, no file path is specified
+# and customized Swift referencing is disabled. Configuring this
+# option is highly recommended while using Swift storage backend for
+# image storage as it avoids storage of credentials in the database.
+#
+# NOTE: Please do not configure this option if you have set
+# ``swift_store_multi_tenant`` to ``True``.
+#
+# Possible values:
+# * String value representing an absolute path on the glance-api
+# node
+#
+# Related options:
+# * swift_store_multi_tenant
+#
+# (string value)
+#swift_store_config_file = <None>
+{% if server.storage.swift.store.references is defined %}
+swift_store_config_file = /etc/glance/swift-stores.conf
+{% endif %}
+
+{% endif %}
+
+#
+# Directory to buffer image segments before upload to Swift.
+#
+# Provide a string value representing the absolute path to the
+# directory on the glance node where image segments will be
+# buffered briefly before they are uploaded to swift.
+#
+# NOTES:
+# * This is required only when the configuration option
+# ``swift_buffer_on_upload`` is set to True.
+# * This directory should be provisioned keeping in mind the
+# ``swift_store_large_object_chunk_size`` and the maximum
+# number of images that could be uploaded simultaneously by
+# a given glance node.
+#
+# Possible values:
+# * String value representing an absolute directory path
+#
+# Related options:
+# * swift_buffer_on_upload
+# * swift_store_large_object_chunk_size
+#
+# (string value)
+#swift_upload_buffer_dir = <None>
+
+{%- if server.storage is defined and server.storage.get('vmware', {}).get('enabled') %}
+{%- set _data = server.storage.vmware %}
+{%- include "glance/files/queens/stores/_vmware.conf" %}
+{%- endif %}
+
+[oslo_concurrency]
+{%- if server.concurrency is defined %}
+{%- set _data = server.concurrency %}
+{%- include "oslo_templates/files/queens/oslo/_concurrency.conf" %}
+{%- endif %}
+
+[matchmaker_redis]
+{#- include "oslo_templates/files/queens/oslo/_matchmaker_redis.conf" #}
+
+[oslo_messaging_amqp]
+{%- set _data = server.amqp %}
+{%- include "oslo_templates/files/queens/oslo/messaging/_amqp.conf" %}
+
+[oslo_messaging_notifications]
+{%- set _data = server.notification %}
+{%- include "oslo_templates/files/queens/oslo/messaging/_notifications.conf" %}
+
+{%- if server.message_queue is defined %}
+{%- set _data = server.message_queue %}
+{%- if _data.engine == 'rabbitmq' %}
+ {%- set messaging_engine = 'rabbit' %}
+{%- else %}
+ {%- set messaging_engine = _data.engine %}
+{%- endif %}
+[oslo_messaging_{{ messaging_engine }}]
+{%- include "oslo_templates/files/queens/oslo/messaging/_" + messaging_engine + ".conf" %}
+{%- endif %}
+
+[database]
+{%- set _data = server.database %}
+{%- if _data.ssl is defined and 'cacert_file' not in _data.get('ssl', {}).keys() %}{% do _data['ssl'].update({'cacert_file': server.cacert_file}) %}{% endif %}
+{%- include "oslo_templates/files/queens/oslo/_database.conf" %}
+
+[oslo_policy]
+{%- if server.oslo_policy is defined %}
+{%- set _data = server.oslo_policy %}
+{%- include "oslo_templates/files/queens/oslo/_policy.conf" %}
+{%- endif %}
+
+[keystone_authtoken]
+{%- set _data = server.identity %}
+{%- if 'cacert_file' not in _data.keys() %}{% do _data.update({'cacert_file': server.cacert_file}) %}{% endif %}
+{%- set auth_type = _data.get('auth_type', 'password') %}
+{%- include "oslo_templates/files/queens/keystonemiddleware/_auth_token.conf" %}
+{%- include "oslo_templates/files/queens/keystoneauth/_type_" + auth_type + ".conf" %}
+
+[cors]
+{%- if server.cors is defined %}
+{%- set _data = server.cors %}
+{%- include "oslo_templates/files/queens/oslo/_cors.conf" %}
+{%- endif %}
+
+[oslo_middleware]
+{%- set _data = server %}
+{%- include "oslo_templates/files/queens/oslo/_middleware.conf" %}
diff --git a/glance/files/queens/glance-api.conf.RedHat b/glance/files/queens/glance-api.conf.RedHat
new file mode 120000
index 0000000..7a47331
--- /dev/null
+++ b/glance/files/queens/glance-api.conf.RedHat
@@ -0,0 +1 @@
+glance-api.conf.Debian
\ No newline at end of file
diff --git a/glance/files/queens/glance-cache.conf.Debian b/glance/files/queens/glance-cache.conf.Debian
new file mode 100644
index 0000000..ab18a63
--- /dev/null
+++ b/glance/files/queens/glance-cache.conf.Debian
@@ -0,0 +1,2442 @@
+{%- from "glance/map.jinja" import server with context %}
+[DEFAULT]
+
+#
+# From glance.cache
+#
+
+#
+# Allow users to add additional/custom properties to images.
+#
+# Glance defines a standard set of properties (in its schema) that
+# appear on every image. These properties are also known as
+# ``base properties``. In addition to these properties, Glance
+# allows users to add custom properties to images. These are known
+# as ``additional properties``.
+#
+# By default, this configuration option is set to ``True`` and users
+# are allowed to add additional properties. The number of additional
+# properties that can be added to an image can be controlled via
+# ``image_property_quota`` configuration option.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * image_property_quota
+#
+# (boolean value)
+#allow_additional_image_properties = true
+
+#
+# Maximum number of image members per image.
+#
+# This limits the maximum of users an image can be shared with. Any
+# negative
+# value is interpreted as unlimited.
+#
+# Related options:
+# * None
+#
+# (integer value)
+#image_member_quota = 128
+
+#
+# Maximum number of properties allowed on an image.
+#
+# This enforces an upper limit on the number of additional properties
+# an image
+# can have. Any negative value is interpreted as unlimited.
+#
+# NOTE: This won't have any impact if additional properties are
+# disabled. Please
+# refer to ``allow_additional_image_properties``.
+#
+# Related options:
+# * ``allow_additional_image_properties``
+#
+# (integer value)
+#image_property_quota = 128
+
+#
+# Maximum number of tags allowed on an image.
+#
+# Any negative value is interpreted as unlimited.
+#
+# Related options:
+# * None
+#
+# (integer value)
+#image_tag_quota = 128
+
+#
+# Maximum number of locations allowed on an image.
+#
+# Any negative value is interpreted as unlimited.
+#
+# Related options:
+# * None
+#
+# (integer value)
+#image_location_quota = 10
+
+# DEPRECATED:
+# Python module path of data access API.
+#
+# Specifies the path to the API to use for accessing the data model.
+# This option determines how the image catalog data will be accessed.
+#
+# Possible values:
+# * glance.db.sqlalchemy.api
+# * glance.db.registry.api
+# * glance.db.simple.api
+#
+# If this option is set to ``glance.db.sqlalchemy.api`` then the image
+# catalog data is stored in and read from the database via the
+# SQLAlchemy Core and ORM APIs.
+#
+# Setting this option to ``glance.db.registry.api`` will force all
+# database access requests to be routed through the Registry service.
+# This avoids data access from the Glance API nodes for an added layer
+# of security, scalability and manageability.
+#
+# NOTE: In v2 OpenStack Images API, the registry service is optional.
+# In order to use the Registry API in v2, the option
+# ``enable_v2_registry`` must be set to ``True``.
+#
+# Finally, when this configuration option is set to
+# ``glance.db.simple.api``, image catalog data is stored in and read
+# from an in-memory data structure. This is primarily used for
+# testing.
+#
+# Related options:
+# * enable_v2_api
+# * enable_v2_registry
+#
+# (string value)
+# This option is deprecated for removal since Queens.
+# Its value may be silently ignored in the future.
+# Reason:
+# Glance registry service is deprecated for removal.
+#
+# More information can be found from the spec:
+# http://specs.openstack.org/openstack/glance-
+# specs/specs/queens/approved/glance/deprecate-registry.html
+#data_api = glance.db.sqlalchemy.api
+
+#
+# The default number of results to return for a request.
+#
+# Responses to certain API requests, like list images, may return
+# multiple items. The number of results returned can be explicitly
+# controlled by specifying the ``limit`` parameter in the API request.
+# However, if a ``limit`` parameter is not specified, this
+# configuration value will be used as the default number of results to
+# be returned for any API request.
+#
+# NOTES:
+# * The value of this configuration option may not be greater than
+# the value specified by ``api_limit_max``.
+# * Setting this to a very large value may slow down database
+# queries and increase response times. Setting this to a
+# very low value may result in poor user experience.
+#
+# Possible values:
+# * Any positive integer
+#
+# Related options:
+# * api_limit_max
+#
+# (integer value)
+# Minimum value: 1
+#limit_param_default = 25
+
+#
+# Maximum number of results that could be returned by a request.
+#
+# As described in the help text of ``limit_param_default``, some
+# requests may return multiple results. The number of results to be
+# returned are governed either by the ``limit`` parameter in the
+# request or the ``limit_param_default`` configuration option.
+# The value in either case, can't be greater than the absolute maximum
+# defined by this configuration option. Anything greater than this
+# value is trimmed down to the maximum value defined here.
+#
+# NOTE: Setting this to a very large value may slow down database
+# queries and increase response times. Setting this to a
+# very low value may result in poor user experience.
+#
+# Possible values:
+# * Any positive integer
+#
+# Related options:
+# * limit_param_default
+#
+# (integer value)
+# Minimum value: 1
+#api_limit_max = 1000
+
+#
+# Show direct image location when returning an image.
+#
+# This configuration option indicates whether to show the direct image
+# location when returning image details to the user. The direct image
+# location is where the image data is stored in backend storage. This
+# image location is shown under the image property ``direct_url``.
+#
+# When multiple image locations exist for an image, the best location
+# is displayed based on the location strategy indicated by the
+# configuration option ``location_strategy``.
+#
+# NOTES:
+# * Revealing image locations can present a GRAVE SECURITY RISK as
+# image locations can sometimes include credentials. Hence, this
+# is set to ``False`` by default. Set this to ``True`` with
+# EXTREME CAUTION and ONLY IF you know what you are doing!
+# * If an operator wishes to avoid showing any image location(s)
+# to the user, then both this option and
+# ``show_multiple_locations`` MUST be set to ``False``.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * show_multiple_locations
+# * location_strategy
+#
+# (boolean value)
+#show_image_direct_url = false
+
+# DEPRECATED:
+# Show all image locations when returning an image.
+#
+# This configuration option indicates whether to show all the image
+# locations when returning image details to the user. When multiple
+# image locations exist for an image, the locations are ordered based
+# on the location strategy indicated by the configuration opt
+# ``location_strategy``. The image locations are shown under the
+# image property ``locations``.
+#
+# NOTES:
+# * Revealing image locations can present a GRAVE SECURITY RISK as
+# image locations can sometimes include credentials. Hence, this
+# is set to ``False`` by default. Set this to ``True`` with
+# EXTREME CAUTION and ONLY IF you know what you are doing!
+# * If an operator wishes to avoid showing any image location(s)
+# to the user, then both this option and
+# ``show_image_direct_url`` MUST be set to ``False``.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * show_image_direct_url
+# * location_strategy
+#
+# (boolean value)
+# This option is deprecated for removal since Newton.
+# Its value may be silently ignored in the future.
+# Reason: This option will be removed in the Pike release or later
+# because the same functionality can be achieved with greater
+# granularity by using policies. Please see the Newton release notes
+# for more information.
+#show_multiple_locations = false
+
+#
+# Maximum size of image a user can upload in bytes.
+#
+# An image upload greater than the size mentioned here would result
+# in an image creation failure. This configuration option defaults to
+# 1099511627776 bytes (1 TiB).
+#
+# NOTES:
+# * This value should only be increased after careful
+# consideration and must be set less than or equal to
+# 8 EiB (9223372036854775808).
+# * This value must be set with careful consideration of the
+# backend storage capacity. Setting this to a very low value
+# may result in a large number of image failures. And, setting
+# this to a very large value may result in faster consumption
+# of storage. Hence, this must be set according to the nature of
+# images created and storage capacity available.
+#
+# Possible values:
+# * Any positive number less than or equal to 9223372036854775808
+#
+# (integer value)
+# Minimum value: 1
+# Maximum value: 9223372036854775808
+#image_size_cap = 1099511627776
+
+#
+# Maximum amount of image storage per tenant.
+#
+# This enforces an upper limit on the cumulative storage consumed by
+# all images
+# of a tenant across all stores. This is a per-tenant limit.
+#
+# The default unit for this configuration option is Bytes. However,
+# storage
+# units can be specified using case-sensitive literals ``B``, ``KB``,
+# ``MB``,
+# ``GB`` and ``TB`` representing Bytes, KiloBytes, MegaBytes,
+# GigaBytes and
+# TeraBytes respectively. Note that there should not be any space
+# between the
+# value and unit. Value ``0`` signifies no quota enforcement. Negative
+# values
+# are invalid and result in errors.
+#
+# Possible values:
+# * A string that is a valid concatenation of a non-negative
+# integer
+# representing the storage value and an optional string literal
+# representing storage units as mentioned above.
+#
+# Related options:
+# * None
+#
+# (string value)
+#user_storage_quota = 0
+
+#
+# Deploy the v1 OpenStack Images API.
+#
+# When this option is set to ``True``, Glance service will respond to
+# requests on registered endpoints conforming to the v1 OpenStack
+# Images API.
+#
+# NOTES:
+# * If this option is enabled, then ``enable_v1_registry`` must
+# also be set to ``True`` to enable mandatory usage of Registry
+# service with v1 API.
+#
+# * If this option is disabled, then the ``enable_v1_registry``
+# option, which is enabled by default, is also recommended
+# to be disabled.
+#
+# * This option is separate from ``enable_v2_api``, both v1 and v2
+# OpenStack Images API can be deployed independent of each
+# other.
+#
+# * If deploying only the v2 Images API, this option, which is
+# enabled by default, should be disabled.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * enable_v1_registry
+# * enable_v2_api
+#
+# (boolean value)
+#enable_v1_api = true
+
+#
+# Deploy the v2 OpenStack Images API.
+#
+# When this option is set to ``True``, Glance service will respond
+# to requests on registered endpoints conforming to the v2 OpenStack
+# Images API.
+#
+# NOTES:
+# * If this option is disabled, then the ``enable_v2_registry``
+# option, which is enabled by default, is also recommended
+# to be disabled.
+#
+# * This option is separate from ``enable_v1_api``, both v1 and v2
+# OpenStack Images API can be deployed independent of each
+# other.
+#
+# * If deploying only the v1 Images API, this option, which is
+# enabled by default, should be disabled.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * enable_v2_registry
+# * enable_v1_api
+#
+# (boolean value)
+#enable_v2_api = true
+
+#
+# Deploy the v1 API Registry service.
+#
+# When this option is set to ``True``, the Registry service
+# will be enabled in Glance for v1 API requests.
+#
+# NOTES:
+# * Use of Registry is mandatory in v1 API, so this option must
+# be set to ``True`` if the ``enable_v1_api`` option is enabled.
+#
+# * If deploying only the v2 OpenStack Images API, this option,
+# which is enabled by default, should be disabled.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * enable_v1_api
+#
+# (boolean value)
+#enable_v1_registry = true
+
+# DEPRECATED:
+# Deploy the v2 API Registry service.
+#
+# When this option is set to ``True``, the Registry service
+# will be enabled in Glance for v2 API requests.
+#
+# NOTES:
+# * Use of Registry is optional in v2 API, so this option
+# must only be enabled if both ``enable_v2_api`` is set to
+# ``True`` and the ``data_api`` option is set to
+# ``glance.db.registry.api``.
+#
+# * If deploying only the v1 OpenStack Images API, this option,
+# which is enabled by default, should be disabled.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * enable_v2_api
+# * data_api
+#
+# (boolean value)
+# This option is deprecated for removal since Queens.
+# Its value may be silently ignored in the future.
+# Reason:
+# Glance registry service is deprecated for removal.
+#
+# More information can be found from the spec:
+# http://specs.openstack.org/openstack/glance-
+# specs/specs/queens/approved/glance/deprecate-registry.html
+#enable_v2_registry = true
+
+#
+# Host address of the pydev server.
+#
+# Provide a string value representing the hostname or IP of the
+# pydev server to use for debugging. The pydev server listens for
+# debug connections on this address, facilitating remote debugging
+# in Glance.
+#
+# Possible values:
+# * Valid hostname
+# * Valid IP address
+#
+# Related options:
+# * None
+#
+# (unknown value)
+#pydev_worker_debug_host = localhost
+
+#
+# Port number that the pydev server will listen on.
+#
+# Provide a port number to bind the pydev server to. The pydev
+# process accepts debug connections on this port and facilitates
+# remote debugging in Glance.
+#
+# Possible values:
+# * A valid port number
+#
+# Related options:
+# * None
+#
+# (port value)
+# Minimum value: 0
+# Maximum value: 65535
+#pydev_worker_debug_port = 5678
+
+#
+# AES key for encrypting store location metadata.
+#
+# Provide a string value representing the AES cipher to use for
+# encrypting Glance store metadata.
+#
+# NOTE: The AES key to use must be set to a random string of length
+# 16, 24 or 32 bytes.
+#
+# Possible values:
+# * String value representing a valid AES key
+#
+# Related options:
+# * None
+#
+# (string value)
+#metadata_encryption_key = <None>
+
+#
+# Digest algorithm to use for digital signature.
+#
+# Provide a string value representing the digest algorithm to
+# use for generating digital signatures. By default, ``sha256``
+# is used.
+#
+# To get a list of the available algorithms supported by the version
+# of OpenSSL on your platform, run the command:
+# ``openssl list-message-digest-algorithms``.
+# Examples are 'sha1', 'sha256', and 'sha512'.
+#
+# NOTE: ``digest_algorithm`` is not related to Glance's image signing
+# and verification. It is only used to sign the universally unique
+# identifier (UUID) as a part of the certificate file and key file
+# validation.
+#
+# Possible values:
+# * An OpenSSL message digest algorithm identifier
+#
+# Relation options:
+# * None
+#
+# (string value)
+#digest_algorithm = sha256
+
+#
+# The URL provides location where the temporary data will be stored
+#
+# This option is for Glance internal use only. Glance will save the
+# image data uploaded by the user to 'staging' endpoint during the
+# image import process.
+#
+# This option does not change the 'staging' API endpoint by any means.
+#
+# NOTE: It is discouraged to use same path as [task]/work_dir
+#
+# NOTE: 'file://<absolute-directory-path>' is the only option
+# api_image_import flow will support for now.
+#
+# NOTE: The staging path must be on shared filesystem available to all
+# Glance API nodes.
+#
+# Possible values:
+# * String starting with 'file://' followed by absolute FS path
+#
+# Related options:
+# * [task]/work_dir
+# * [DEFAULT]/enable_image_import (*deprecated*)
+#
+# (string value)
+#node_staging_uri = file:///tmp/staging/
+
+# DEPRECATED:
+# Enables the Image Import workflow introduced in Pike
+#
+# As '[DEFAULT]/node_staging_uri' is required for the Image
+# Import, it's disabled per default in Pike, enabled per
+# default in Queens and removed in Rocky. This allows Glance to
+# operate with previous version configs upon upgrade.
+#
+# Setting this option to False will disable the endpoints related
+# to Image Import Refactoring work.
+#
+# Related options:
+# * [DEFAULT]/node_staging_uri (boolean value)
+# This option is deprecated for removal since Pike.
+# Its value may be silently ignored in the future.
+# Reason:
+# This option is deprecated for removal in Rocky.
+#
+# It was introduced to make sure that the API is not enabled
+# before the '[DEFAULT]/node_staging_uri' is defined and is
+# long term redundant.
+#enable_image_import = true
+
+#
+# List of enabled Image Import Methods
+#
+# Both 'glance-direct' and 'web-download' are enabled by default.
+#
+# Related options:
+# * [DEFAULT]/node_staging_uri
+# * [DEFAULT]/enable_image_import (list value)
+#enabled_import_methods = glance-direct,web-download
+
+#
+# The relative path to sqlite file database that will be used for
+# image cache
+# management.
+#
+# This is a relative path to the sqlite file database that tracks the
+# age and
+# usage statistics of image cache. The path is relative to image cache
+# base
+# directory, specified by the configuration option
+# ``image_cache_dir``.
+#
+# This is a lightweight database with just one table.
+#
+# Possible values:
+# * A valid relative path to sqlite file database
+#
+# Related options:
+# * ``image_cache_dir``
+#
+# (string value)
+#image_cache_sqlite_db = cache.db
+
+#
+# The driver to use for image cache management.
+#
+# This configuration option provides the flexibility to choose between
+# the
+# different image-cache drivers available. An image-cache driver is
+# responsible
+# for providing the essential functions of image-cache like write
+# images to/read
+# images from cache, track age and usage of cached images, provide a
+# list of
+# cached images, fetch size of the cache, queue images for caching and
+# clean up
+# the cache, etc.
+#
+# The essential functions of a driver are defined in the base class
+# ``glance.image_cache.drivers.base.Driver``. All image-cache drivers
+# (existing
+# and prospective) must implement this interface. Currently available
+# drivers
+# are ``sqlite`` and ``xattr``. These drivers primarily differ in the
+# way they
+# store the information about cached images:
+# * The ``sqlite`` driver uses a sqlite database (which sits on
+# every glance
+# node locally) to track the usage of cached images.
+# * The ``xattr`` driver uses the extended attributes of files to
+# store this
+# information. It also requires a filesystem that sets ``atime``
+# on the files
+# when accessed.
+#
+# Possible values:
+# * sqlite
+# * xattr
+#
+# Related options:
+# * None
+#
+# (string value)
+# Possible values:
+# sqlite - <No description provided>
+# xattr - <No description provided>
+#image_cache_driver = sqlite
+
+#
+# The upper limit on cache size, in bytes, after which the cache-
+# pruner cleans
+# up the image cache.
+#
+# NOTE: This is just a threshold for cache-pruner to act upon. It is
+# NOT a
+# hard limit beyond which the image cache would never grow. In fact,
+# depending
+# on how often the cache-pruner runs and how quickly the cache fills,
+# the image
+# cache can far exceed the size specified here very easily. Hence,
+# care must be
+# taken to appropriately schedule the cache-pruner and in setting this
+# limit.
+#
+# Glance caches an image when it is downloaded. Consequently, the size
+# of the
+# image cache grows over time as the number of downloads increases. To
+# keep the
+# cache size from becoming unmanageable, it is recommended to run the
+# cache-pruner as a periodic task. When the cache pruner is kicked
+# off, it
+# compares the current size of image cache and triggers a cleanup if
+# the image
+# cache grew beyond the size specified here. After the cleanup, the
+# size of
+# cache is less than or equal to size specified here.
+#
+# Possible values:
+# * Any non-negative integer
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+#image_cache_max_size = 10737418240
+{% if server.get('image_cache', {}).get('enabled', False) %}
+
+image_cache_max_size = {{ server.image_cache.get('max_size', '10737418240') }}
+image_cache_stall_time = {{ server.image_cache.get('stall_time', '86400') }}
+image_cache_dir = {{ server.image_cache.get('directory', '/var/lib/glance/image-cache/') }}
+{% endif %}
+
+{% if server.identity.region is defined %}
+os_region_name = {{ server.identity.region }}
+{% endif %}
+
+#
+# The amount of time, in seconds, an incomplete image remains in the
+# cache.
+#
+# Incomplete images are images for which download is in progress.
+# Please see the
+# description of configuration option ``image_cache_dir`` for more
+# detail.
+# Sometimes, due to various reasons, it is possible the download may
+# hang and
+# the incompletely downloaded image remains in the ``incomplete``
+# directory.
+# This configuration option sets a time limit on how long the
+# incomplete images
+# should remain in the ``incomplete`` directory before they are
+# cleaned up.
+# Once an incomplete image spends more time than is specified here,
+# it'll be
+# removed by cache-cleaner on its next run.
+#
+# It is recommended to run cache-cleaner as a periodic task on the
+# Glance API
+# nodes to keep the incomplete images from occupying disk space.
+#
+# Possible values:
+# * Any non-negative integer
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+#image_cache_stall_time = 86400
+
+#
+# Base directory for image cache.
+#
+# This is the location where image data is cached and served out of.
+# All cached
+# images are stored directly under this directory. This directory also
+# contains
+# three subdirectories, namely, ``incomplete``, ``invalid`` and
+# ``queue``.
+#
+# The ``incomplete`` subdirectory is the staging area for downloading
+# images. An
+# image is first downloaded to this directory. When the image download
+# is
+# successful it is moved to the base directory. However, if the
+# download fails,
+# the partially downloaded image file is moved to the ``invalid``
+# subdirectory.
+#
+# The ``queue``subdirectory is used for queuing images for download.
+# This is
+# used primarily by the cache-prefetcher, which can be scheduled as a
+# periodic
+# task like cache-pruner and cache-cleaner, to cache images ahead of
+# their usage.
+# Upon receiving the request to cache an image, Glance touches a file
+# in the
+# ``queue`` directory with the image id as the file name. The cache-
+# prefetcher,
+# when running, polls for the files in ``queue`` directory and starts
+# downloading them in the order they were created. When the download
+# is
+# successful, the zero-sized file is deleted from the ``queue``
+# directory.
+# If the download fails, the zero-sized file remains and it'll be
+# retried the
+# next time cache-prefetcher runs.
+#
+# Possible values:
+# * A valid path
+#
+# Related options:
+# * ``image_cache_sqlite_db``
+#
+# (string value)
+#image_cache_dir = <None>
+
+# DEPRECATED:
+# Address the registry server is hosted on.
+#
+# Possible values:
+# * A valid IP or hostname
+#
+# Related options:
+# * None
+#
+# (unknown value)
+# This option is deprecated for removal since Queens.
+# Its value may be silently ignored in the future.
+# Reason:
+# Glance registry service is deprecated for removal.
+#
+# More information can be found from the spec:
+# http://specs.openstack.org/openstack/glance-
+# specs/specs/queens/approved/glance/deprecate-registry.html
+#registry_host = {{ server.registry.host }}
+
+# DEPRECATED:
+# Port the registry server is listening on.
+#
+# Possible values:
+# * A valid port number
+#
+# Related options:
+# * None
+#
+# (port value)
+# Minimum value: 0
+# Maximum value: 65535
+# This option is deprecated for removal since Queens.
+# Its value may be silently ignored in the future.
+# Reason:
+# Glance registry service is deprecated for removal.
+#
+# More information can be found from the spec:
+# http://specs.openstack.org/openstack/glance-
+# specs/specs/queens/approved/glance/deprecate-registry.html
+#registry_port = {{ server.registry.port }}
+
+# DEPRECATED:
+# Protocol to use for communication with the registry server.
+#
+# Provide a string value representing the protocol to use for
+# communication with the registry server. By default, this option is
+# set to ``http`` and the connection is not secure.
+#
+# This option can be set to ``https`` to establish a secure connection
+# to the registry server. In this case, provide a key to use for the
+# SSL connection using the ``registry_client_key_file`` option. Also
+# include the CA file and cert file using the options
+# ``registry_client_ca_file`` and ``registry_client_cert_file``
+# respectively.
+#
+# Possible values:
+# * http
+# * https
+#
+# Related options:
+# * registry_client_key_file
+# * registry_client_cert_file
+# * registry_client_ca_file
+#
+# (string value)
+# Possible values:
+# http - <No description provided>
+# https - <No description provided>
+# This option is deprecated for removal since Queens.
+# Its value may be silently ignored in the future.
+# Reason:
+# Glance registry service is deprecated for removal.
+#
+# More information can be found from the spec:
+# http://specs.openstack.org/openstack/glance-
+# specs/specs/queens/approved/glance/deprecate-registry.html
+#registry_client_protocol = http
+
+# DEPRECATED:
+# Absolute path to the private key file.
+#
+# Provide a string value representing a valid absolute path to the
+# private key file to use for establishing a secure connection to
+# the registry server.
+#
+# NOTE: This option must be set if ``registry_client_protocol`` is
+# set to ``https``. Alternatively, the GLANCE_CLIENT_KEY_FILE
+# environment variable may be set to a filepath of the key file.
+#
+# Possible values:
+# * String value representing a valid absolute path to the key
+# file.
+#
+# Related options:
+# * registry_client_protocol
+#
+# (string value)
+# This option is deprecated for removal since Queens.
+# Its value may be silently ignored in the future.
+# Reason:
+# Glance registry service is deprecated for removal.
+#
+# More information can be found from the spec:
+# http://specs.openstack.org/openstack/glance-
+# specs/specs/queens/approved/glance/deprecate-registry.html
+#registry_client_key_file = /etc/ssl/key/key-file.pem
+
+# DEPRECATED:
+# Absolute path to the certificate file.
+#
+# Provide a string value representing a valid absolute path to the
+# certificate file to use for establishing a secure connection to
+# the registry server.
+#
+# NOTE: This option must be set if ``registry_client_protocol`` is
+# set to ``https``. Alternatively, the GLANCE_CLIENT_CERT_FILE
+# environment variable may be set to a filepath of the certificate
+# file.
+#
+# Possible values:
+# * String value representing a valid absolute path to the
+# certificate file.
+#
+# Related options:
+# * registry_client_protocol
+#
+# (string value)
+# This option is deprecated for removal since Queens.
+# Its value may be silently ignored in the future.
+# Reason:
+# Glance registry service is deprecated for removal.
+#
+# More information can be found from the spec:
+# http://specs.openstack.org/openstack/glance-
+# specs/specs/queens/approved/glance/deprecate-registry.html
+#registry_client_cert_file = /etc/ssl/certs/file.crt
+
+# DEPRECATED:
+# Absolute path to the Certificate Authority file.
+#
+# Provide a string value representing a valid absolute path to the
+# certificate authority file to use for establishing a secure
+# connection to the registry server.
+#
+# NOTE: This option must be set if ``registry_client_protocol`` is
+# set to ``https``. Alternatively, the GLANCE_CLIENT_CA_FILE
+# environment variable may be set to a filepath of the CA file.
+# This option is ignored if the ``registry_client_insecure`` option
+# is set to ``True``.
+#
+# Possible values:
+# * String value representing a valid absolute path to the CA
+# file.
+#
+# Related options:
+# * registry_client_protocol
+# * registry_client_insecure
+#
+# (string value)
+# This option is deprecated for removal since Queens.
+# Its value may be silently ignored in the future.
+# Reason:
+# Glance registry service is deprecated for removal.
+#
+# More information can be found from the spec:
+# http://specs.openstack.org/openstack/glance-
+# specs/specs/queens/approved/glance/deprecate-registry.html
+#registry_client_ca_file = /etc/ssl/cafile/file.ca
+
+# DEPRECATED:
+# Set verification of the registry server certificate.
+#
+# Provide a boolean value to determine whether or not to validate
+# SSL connections to the registry server. By default, this option
+# is set to ``False`` and the SSL connections are validated.
+#
+# If set to ``True``, the connection to the registry server is not
+# validated via a certifying authority and the
+# ``registry_client_ca_file`` option is ignored. This is the
+# registry's equivalent of specifying --insecure on the command line
+# using glanceclient for the API.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * registry_client_protocol
+# * registry_client_ca_file
+#
+# (boolean value)
+# This option is deprecated for removal since Queens.
+# Its value may be silently ignored in the future.
+# Reason:
+# Glance registry service is deprecated for removal.
+#
+# More information can be found from the spec:
+# http://specs.openstack.org/openstack/glance-
+# specs/specs/queens/approved/glance/deprecate-registry.html
+#registry_client_insecure = false
+
+# DEPRECATED:
+# Timeout value for registry requests.
+#
+# Provide an integer value representing the period of time in seconds
+# that the API server will wait for a registry request to complete.
+# The default value is 600 seconds.
+#
+# A value of 0 implies that a request will never timeout.
+#
+# Possible values:
+# * Zero
+# * Positive integer
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+# This option is deprecated for removal since Queens.
+# Its value may be silently ignored in the future.
+# Reason:
+# Glance registry service is deprecated for removal.
+#
+# More information can be found from the spec:
+# http://specs.openstack.org/openstack/glance-
+# specs/specs/queens/approved/glance/deprecate-registry.html
+#registry_client_timeout = 600
+
+# DEPRECATED: Whether to pass through the user token when making
+# requests to the registry. To prevent failures with token expiration
+# during big files upload, it is recommended to set this parameter to
+# False.If "use_user_token" is not in effect, then admin credentials
+# can be specified. (boolean value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: This option was considered harmful and has been deprecated
+# in M release. It will be removed in O release. For more information
+# read OSSN-0060. Related functionality with uploading big images has
+# been implemented with Keystone trusts support.
+#use_user_token = true
+
+# DEPRECATED: The administrators user name. If "use_user_token" is not
+# in effect, then admin credentials can be specified. (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: This option was considered harmful and has been deprecated
+# in M release. It will be removed in O release. For more information
+# read OSSN-0060. Related functionality with uploading big images has
+# been implemented with Keystone trusts support.
+#admin_user = <None>
+
+# DEPRECATED: The administrators password. If "use_user_token" is not
+# in effect, then admin credentials can be specified. (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: This option was considered harmful and has been deprecated
+# in M release. It will be removed in O release. For more information
+# read OSSN-0060. Related functionality with uploading big images has
+# been implemented with Keystone trusts support.
+#admin_password = <None>
+
+# DEPRECATED: The tenant name of the administrative user. If
+# "use_user_token" is not in effect, then admin tenant name can be
+# specified. (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: This option was considered harmful and has been deprecated
+# in M release. It will be removed in O release. For more information
+# read OSSN-0060. Related functionality with uploading big images has
+# been implemented with Keystone trusts support.
+#admin_tenant_name = <None>
+
+# DEPRECATED: The URL to the keystone service. If "use_user_token" is
+# not in effect and using keystone auth, then URL of keystone can be
+# specified. (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: This option was considered harmful and has been deprecated
+# in M release. It will be removed in O release. For more information
+# read OSSN-0060. Related functionality with uploading big images has
+# been implemented with Keystone trusts support.
+#auth_url = <None>
+
+# DEPRECATED: The strategy to use for authentication. If
+# "use_user_token" is not in effect, then auth strategy can be
+# specified. (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: This option was considered harmful and has been deprecated
+# in M release. It will be removed in O release. For more information
+# read OSSN-0060. Related functionality with uploading big images has
+# been implemented with Keystone trusts support.
+#auth_strategy = noauth
+
+# DEPRECATED: The region for the authentication service. If
+# "use_user_token" is not in effect and using keystone auth, then
+# region name can be specified. (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: This option was considered harmful and has been deprecated
+# in M release. It will be removed in O release. For more information
+# read OSSN-0060. Related functionality with uploading big images has
+# been implemented with Keystone trusts support.
+#auth_region = <None>
+
+{%- if server.logging is defined %}
+{%- set _data = server.logging %}
+{%- do _data.update({'log_file': '/var/log/glance/image-cache.log'}) %}
+{%- include "oslo_templates/files/queens/oslo/_log.conf" %}
+{%- endif %}
+
+[glance_store]
+
+#
+# From glance.store
+#
+
+#
+# List of enabled Glance stores.
+#
+# Register the storage backends to use for storing disk images
+# as a comma separated list. The default stores enabled for
+# storing disk images with Glance are ``file`` and ``http``.
+#
+# Possible values:
+# * A comma separated list that could include:
+# * file
+# * http
+# * swift
+# * rbd
+# * sheepdog
+# * cinder
+# * vmware
+#
+# Related Options:
+# * default_store
+#
+# (list value)
+#stores = file,http
+
+#
+# The default scheme to use for storing images.
+#
+# Provide a string value representing the default scheme to use for
+# storing images. If not set, Glance uses ``file`` as the default
+# scheme to store images with the ``file`` store.
+#
+# NOTE: The value given for this configuration option must be a valid
+# scheme for a store registered with the ``stores`` configuration
+# option.
+#
+# Possible values:
+# * file
+# * filesystem
+# * http
+# * https
+# * swift
+# * swift+http
+# * swift+https
+# * swift+config
+# * rbd
+# * sheepdog
+# * cinder
+# * vsphere
+#
+# Related Options:
+# * stores
+#
+# (string value)
+# Possible values:
+# file - <No description provided>
+# filesystem - <No description provided>
+# http - <No description provided>
+# https - <No description provided>
+# swift - <No description provided>
+# swift+http - <No description provided>
+# swift+https - <No description provided>
+# swift+config - <No description provided>
+# rbd - <No description provided>
+# sheepdog - <No description provided>
+# cinder - <No description provided>
+# vsphere - <No description provided>
+#default_store = file
+
+#
+# Minimum interval in seconds to execute updating dynamic storage
+# capabilities based on current backend status.
+#
+# Provide an integer value representing time in seconds to set the
+# minimum interval before an update of dynamic storage capabilities
+# for a storage backend can be attempted. Setting
+# ``store_capabilities_update_min_interval`` does not mean updates
+# occur periodically based on the set interval. Rather, the update
+# is performed at the elapse of this interval set, if an operation
+# of the store is triggered.
+#
+# By default, this option is set to zero and is disabled. Provide an
+# integer value greater than zero to enable this option.
+#
+# NOTE: For more information on store capabilities and their updates,
+# please visit: https://specs.openstack.org/openstack/glance-
+# specs/specs/kilo/store-capabilities.html
+#
+# For more information on setting up a particular store in your
+# deployment and help with the usage of this feature, please contact
+# the storage driver maintainers listed here:
+# http://docs.openstack.org/developer/glance_store/drivers/index.html
+#
+# Possible values:
+# * Zero
+# * Positive integer
+#
+# Related Options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+#store_capabilities_update_min_interval = 0
+
+#
+# Information to match when looking for cinder in the service catalog.
+#
+# When the ``cinder_endpoint_template`` is not set and any of
+# ``cinder_store_auth_address``, ``cinder_store_user_name``,
+# ``cinder_store_project_name``, ``cinder_store_password`` is not set,
+# cinder store uses this information to lookup cinder endpoint from
+# the service
+# catalog in the current context. ``cinder_os_region_name``, if set,
+# is taken
+# into consideration to fetch the appropriate endpoint.
+#
+# The service catalog can be listed by the ``openstack catalog list``
+# command.
+#
+# Possible values:
+# * A string of of the following form:
+# ``<service_type>:<service_name>:<interface>``
+# At least ``service_type`` and ``interface`` should be
+# specified.
+# ``service_name`` can be omitted.
+#
+# Related options:
+# * cinder_os_region_name
+# * cinder_endpoint_template
+# * cinder_store_auth_address
+# * cinder_store_user_name
+# * cinder_store_project_name
+# * cinder_store_password
+#
+# (string value)
+#cinder_catalog_info = volumev2::publicURL
+
+#
+# Override service catalog lookup with template for cinder endpoint.
+#
+# When this option is set, this value is used to generate cinder
+# endpoint,
+# instead of looking up from the service catalog.
+# This value is ignored if ``cinder_store_auth_address``,
+# ``cinder_store_user_name``, ``cinder_store_project_name``, and
+# ``cinder_store_password`` are specified.
+#
+# If this configuration option is set, ``cinder_catalog_info`` will be
+# ignored.
+#
+# Possible values:
+# * URL template string for cinder endpoint, where ``%%(tenant)s``
+# is
+# replaced with the current tenant (project) name.
+# For example:
+# ``http://cinder.openstack.example.org/v2/%%(tenant)s``
+#
+# Related options:
+# * cinder_store_auth_address
+# * cinder_store_user_name
+# * cinder_store_project_name
+# * cinder_store_password
+# * cinder_catalog_info
+#
+# (string value)
+#cinder_endpoint_template = <None>
+
+#
+# Region name to lookup cinder service from the service catalog.
+#
+# This is used only when ``cinder_catalog_info`` is used for
+# determining the
+# endpoint. If set, the lookup for cinder endpoint by this node is
+# filtered to
+# the specified region. It is useful when multiple regions are listed
+# in the
+# catalog. If this is not set, the endpoint is looked up from every
+# region.
+#
+# Possible values:
+# * A string that is a valid region name.
+#
+# Related options:
+# * cinder_catalog_info
+#
+# (string value)
+# Deprecated group/name - [glance_store]/os_region_name
+#cinder_os_region_name = <None>
+
+#
+# Location of a CA certificates file used for cinder client requests.
+#
+# The specified CA certificates file, if set, is used to verify cinder
+# connections via HTTPS endpoint. If the endpoint is HTTP, this value
+# is ignored.
+# ``cinder_api_insecure`` must be set to ``True`` to enable the
+# verification.
+#
+# Possible values:
+# * Path to a ca certificates file
+#
+# Related options:
+# * cinder_api_insecure
+#
+# (string value)
+#cinder_ca_certificates_file = <None>
+
+#
+# Number of cinderclient retries on failed http calls.
+#
+# When a call failed by any errors, cinderclient will retry the call
+# up to the
+# specified times after sleeping a few seconds.
+#
+# Possible values:
+# * A positive integer
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+#cinder_http_retries = 3
+
+#
+# Time period, in seconds, to wait for a cinder volume transition to
+# complete.
+#
+# When the cinder volume is created, deleted, or attached to the
+# glance node to
+# read/write the volume data, the volume's state is changed. For
+# example, the
+# newly created volume status changes from ``creating`` to
+# ``available`` after
+# the creation process is completed. This specifies the maximum time
+# to wait for
+# the status change. If a timeout occurs while waiting, or the status
+# is changed
+# to an unexpected value (e.g. `error``), the image creation fails.
+#
+# Possible values:
+# * A positive integer
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+#cinder_state_transition_timeout = 300
+
+#
+# Allow to perform insecure SSL requests to cinder.
+#
+# If this option is set to True, HTTPS endpoint connection is verified
+# using the
+# CA certificates file specified by ``cinder_ca_certificates_file``
+# option.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * cinder_ca_certificates_file
+#
+# (boolean value)
+#cinder_api_insecure = false
+
+#
+# The address where the cinder authentication service is listening.
+#
+# When all of ``cinder_store_auth_address``,
+# ``cinder_store_user_name``,
+# ``cinder_store_project_name``, and ``cinder_store_password`` options
+# are
+# specified, the specified values are always used for the
+# authentication.
+# This is useful to hide the image volumes from users by storing them
+# in a
+# project/tenant specific to the image service. It also enables users
+# to share
+# the image volume among other projects under the control of glance's
+# ACL.
+#
+# If either of these options are not set, the cinder endpoint is
+# looked up
+# from the service catalog, and current context's user and project are
+# used.
+#
+# Possible values:
+# * A valid authentication service address, for example:
+# ``http://openstack.example.org/identity/v2.0``
+#
+# Related options:
+# * cinder_store_user_name
+# * cinder_store_password
+# * cinder_store_project_name
+#
+# (string value)
+#cinder_store_auth_address = <None>
+
+#
+# User name to authenticate against cinder.
+#
+# This must be used with all the following related options. If any of
+# these are
+# not specified, the user of the current context is used.
+#
+# Possible values:
+# * A valid user name
+#
+# Related options:
+# * cinder_store_auth_address
+# * cinder_store_password
+# * cinder_store_project_name
+#
+# (string value)
+#cinder_store_user_name = <None>
+
+#
+# Password for the user authenticating against cinder.
+#
+# This must be used with all the following related options. If any of
+# these are
+# not specified, the user of the current context is used.
+#
+# Possible values:
+# * A valid password for the user specified by
+# ``cinder_store_user_name``
+#
+# Related options:
+# * cinder_store_auth_address
+# * cinder_store_user_name
+# * cinder_store_project_name
+#
+# (string value)
+#cinder_store_password = <None>
+
+#
+# Project name where the image volume is stored in cinder.
+#
+# If this configuration option is not set, the project in current
+# context is
+# used.
+#
+# This must be used with all the following related options. If any of
+# these are
+# not specified, the project of the current context is used.
+#
+# Possible values:
+# * A valid project name
+#
+# Related options:
+# * ``cinder_store_auth_address``
+# * ``cinder_store_user_name``
+# * ``cinder_store_password``
+#
+# (string value)
+#cinder_store_project_name = <None>
+
+#
+# Path to the rootwrap configuration file to use for running commands
+# as root.
+#
+# The cinder store requires root privileges to operate the image
+# volumes (for
+# connecting to iSCSI/FC volumes and reading/writing the volume data,
+# etc.).
+# The configuration file should allow the required commands by cinder
+# store and
+# os-brick library.
+#
+# Possible values:
+# * Path to the rootwrap config file
+#
+# Related options:
+# * None
+#
+# (string value)
+#rootwrap_config = /etc/glance/rootwrap.conf
+
+#
+# Volume type that will be used for volume creation in cinder.
+#
+# Some cinder backends can have several volume types to optimize
+# storage usage.
+# Adding this option allows an operator to choose a specific volume
+# type
+# in cinder that can be optimized for images.
+#
+# If this is not set, then the default volume type specified in the
+# cinder
+# configuration will be used for volume creation.
+#
+# Possible values:
+# * A valid volume type from cinder
+#
+# Related options:
+# * None
+#
+# (string value)
+#cinder_volume_type = <None>
+
+#
+# Directory to which the filesystem backend store writes images.
+#
+# Upon start up, Glance creates the directory if it doesn't already
+# exist and verifies write access to the user under which
+# ``glance-api`` runs. If the write access isn't available, a
+# ``BadStoreConfiguration`` exception is raised and the filesystem
+# store may not be available for adding new images.
+#
+# NOTE: This directory is used only when filesystem store is used as a
+# storage backend. Either ``filesystem_store_datadir`` or
+# ``filesystem_store_datadirs`` option must be specified in
+# ``glance-api.conf``. If both options are specified, a
+# ``BadStoreConfiguration`` will be raised and the filesystem store
+# may not be available for adding new images.
+#
+# Possible values:
+# * A valid path to a directory
+#
+# Related options:
+# * ``filesystem_store_datadirs``
+# * ``filesystem_store_file_perm``
+#
+# (string value)
+#filesystem_store_datadir = /var/lib/glance/images
+
+#
+# List of directories and their priorities to which the filesystem
+# backend store writes images.
+#
+# The filesystem store can be configured to store images in multiple
+# directories as opposed to using a single directory specified by the
+# ``filesystem_store_datadir`` configuration option. When using
+# multiple directories, each directory can be given an optional
+# priority to specify the preference order in which they should
+# be used. Priority is an integer that is concatenated to the
+# directory path with a colon where a higher value indicates higher
+# priority. When two directories have the same priority, the directory
+# with most free space is used. When no priority is specified, it
+# defaults to zero.
+#
+# More information on configuring filesystem store with multiple store
+# directories can be found at
+# http://docs.openstack.org/developer/glance/configuring.html
+#
+# NOTE: This directory is used only when filesystem store is used as a
+# storage backend. Either ``filesystem_store_datadir`` or
+# ``filesystem_store_datadirs`` option must be specified in
+# ``glance-api.conf``. If both options are specified, a
+# ``BadStoreConfiguration`` will be raised and the filesystem store
+# may not be available for adding new images.
+#
+# Possible values:
+# * List of strings of the following form:
+# * ``<a valid directory path>:<optional integer priority>``
+#
+# Related options:
+# * ``filesystem_store_datadir``
+# * ``filesystem_store_file_perm``
+#
+# (multi valued)
+#filesystem_store_datadirs =
+
+#
+# Filesystem store metadata file.
+#
+# The path to a file which contains the metadata to be returned with
+# any location associated with the filesystem store. The file must
+# contain a valid JSON object. The object should contain the keys
+# ``id`` and ``mountpoint``. The value for both keys should be a
+# string.
+#
+# Possible values:
+# * A valid path to the store metadata file
+#
+# Related options:
+# * None
+#
+# (string value)
+#filesystem_store_metadata_file = <None>
+{%- if server.filesystem_store_metadata_file is defined %}
+filesystem_store_metadata_file = {{ server.get('filesystem_store_metadata_file', '/etc/glance/filesystem_store_metadata.json') }}
+{%- endif %}
+
+#
+# File access permissions for the image files.
+#
+# Set the intended file access permissions for image data. This
+# provides
+# a way to enable other services, e.g. Nova, to consume images
+# directly
+# from the filesystem store. The users running the services that are
+# intended to be given access to could be made a member of the group
+# that owns the files created. Assigning a value less then or equal to
+# zero for this configuration option signifies that no changes be made
+# to the default permissions. This value will be decoded as an octal
+# digit.
+#
+# For more information, please refer the documentation at
+# http://docs.openstack.org/developer/glance/configuring.html
+#
+# Possible values:
+# * A valid file access permission
+# * Zero
+# * Any negative integer
+#
+# Related options:
+# * None
+#
+# (integer value)
+#filesystem_store_file_perm = 0
+
+#
+# Path to the CA bundle file.
+#
+# This configuration option enables the operator to use a custom
+# Certificate Authority file to verify the remote server certificate.
+# If
+# this option is set, the ``https_insecure`` option will be ignored
+# and
+# the CA file specified will be used to authenticate the server
+# certificate and establish a secure connection to the server.
+#
+# Possible values:
+# * A valid path to a CA file
+#
+# Related options:
+# * https_insecure
+#
+# (string value)
+#https_ca_certificates_file = <None>
+
+#
+# Set verification of the remote server certificate.
+#
+# This configuration option takes in a boolean value to determine
+# whether or not to verify the remote server certificate. If set to
+# True, the remote server certificate is not verified. If the option
+# is
+# set to False, then the default CA truststore is used for
+# verification.
+#
+# This option is ignored if ``https_ca_certificates_file`` is set.
+# The remote server certificate will then be verified using the file
+# specified using the ``https_ca_certificates_file`` option.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * https_ca_certificates_file
+#
+# (boolean value)
+#https_insecure = true
+
+#
+# The http/https proxy information to be used to connect to the remote
+# server.
+#
+# This configuration option specifies the http/https proxy information
+# that should be used to connect to the remote server. The proxy
+# information should be a key value pair of the scheme and proxy, for
+# example, http:10.0.0.1:3128. You can also specify proxies for
+# multiple
+# schemes by separating the key value pairs with a comma, for example,
+# http:10.0.0.1:3128, https:10.0.0.1:1080.
+#
+# Possible values:
+# * A comma separated list of scheme:proxy pairs as described
+# above
+#
+# Related options:
+# * None
+#
+# (dict value)
+#http_proxy_information =
+
+#
+# Size, in megabytes, to chunk RADOS images into.
+#
+# Provide an integer value representing the size in megabytes to chunk
+# Glance images into. The default chunk size is 8 megabytes. For
+# optimal
+# performance, the value should be a power of two.
+#
+# When Ceph's RBD object storage system is used as the storage backend
+# for storing Glance images, the images are chunked into objects of
+# the
+# size set using this option. These chunked objects are then stored
+# across the distributed block data store to use for Glance.
+#
+# Possible Values:
+# * Any positive integer value
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 1
+#rbd_store_chunk_size = 8
+
+#
+# RADOS pool in which images are stored.
+#
+# When RBD is used as the storage backend for storing Glance images,
+# the
+# images are stored by means of logical grouping of the objects
+# (chunks
+# of images) into a ``pool``. Each pool is defined with the number of
+# placement groups it can contain. The default pool that is used is
+# 'images'.
+#
+# More information on the RBD storage backend can be found here:
+# http://ceph.com/planet/how-data-is-stored-in-ceph-cluster/
+#
+# Possible Values:
+# * A valid pool name
+#
+# Related options:
+# * None
+#
+# (string value)
+#rbd_store_pool = images
+
+#
+# RADOS user to authenticate as.
+#
+# This configuration option takes in the RADOS user to authenticate
+# as.
+# This is only needed when RADOS authentication is enabled and is
+# applicable only if the user is using Cephx authentication. If the
+# value for this option is not set by the user or is set to None, a
+# default value will be chosen, which will be based on the client.
+# section in rbd_store_ceph_conf.
+#
+# Possible Values:
+# * A valid RADOS user
+#
+# Related options:
+# * rbd_store_ceph_conf
+#
+# (string value)
+#rbd_store_user = <None>
+
+#
+# Ceph configuration file path.
+#
+# This configuration option takes in the path to the Ceph
+# configuration
+# file to be used. If the value for this option is not set by the user
+# or is set to None, librados will locate the default configuration
+# file
+# which is located at /etc/ceph/ceph.conf. If using Cephx
+# authentication, this file should include a reference to the right
+# keyring in a client.<USER> section
+#
+# Possible Values:
+# * A valid path to a configuration file
+#
+# Related options:
+# * rbd_store_user
+#
+# (string value)
+#rbd_store_ceph_conf = /etc/ceph/ceph.conf
+
+#
+# Timeout value for connecting to Ceph cluster.
+#
+# This configuration option takes in the timeout value in seconds used
+# when connecting to the Ceph cluster i.e. it sets the time to wait
+# for
+# glance-api before closing the connection. This prevents glance-api
+# hangups during the connection to RBD. If the value for this option
+# is set to less than or equal to 0, no timeout is set and the default
+# librados value is used.
+#
+# Possible Values:
+# * Any integer value
+#
+# Related options:
+# * None
+#
+# (integer value)
+#rados_connect_timeout = 0
+
+#
+# Chunk size for images to be stored in Sheepdog data store.
+#
+# Provide an integer value representing the size in mebibyte
+# (1048576 bytes) to chunk Glance images into. The default
+# chunk size is 64 mebibytes.
+#
+# When using Sheepdog distributed storage system, the images are
+# chunked into objects of this size and then stored across the
+# distributed data store to use for Glance.
+#
+# Chunk sizes, if a power of two, help avoid fragmentation and
+# enable improved performance.
+#
+# Possible values:
+# * Positive integer value representing size in mebibytes.
+#
+# Related Options:
+# * None
+#
+# (integer value)
+# Minimum value: 1
+#sheepdog_store_chunk_size = 64
+
+#
+# Port number on which the sheep daemon will listen.
+#
+# Provide an integer value representing a valid port number on
+# which you want the Sheepdog daemon to listen on. The default
+# port is 7000.
+#
+# The Sheepdog daemon, also called 'sheep', manages the storage
+# in the distributed cluster by writing objects across the storage
+# network. It identifies and acts on the messages it receives on
+# the port number set using ``sheepdog_store_port`` option to store
+# chunks of Glance images.
+#
+# Possible values:
+# * A valid port number (0 to 65535)
+#
+# Related Options:
+# * sheepdog_store_address
+#
+# (port value)
+# Minimum value: 0
+# Maximum value: 65535
+#sheepdog_store_port = 7000
+
+#
+# Address to bind the Sheepdog daemon to.
+#
+# Provide a string value representing the address to bind the
+# Sheepdog daemon to. The default address set for the 'sheep'
+# is 127.0.0.1.
+#
+# The Sheepdog daemon, also called 'sheep', manages the storage
+# in the distributed cluster by writing objects across the storage
+# network. It identifies and acts on the messages directed to the
+# address set using ``sheepdog_store_address`` option to store
+# chunks of Glance images.
+#
+# Possible values:
+# * A valid IPv4 address
+# * A valid IPv6 address
+# * A valid hostname
+#
+# Related Options:
+# * sheepdog_store_port
+#
+# (unknown value)
+#sheepdog_store_address = 127.0.0.1
+
+#
+# Set verification of the server certificate.
+#
+# This boolean determines whether or not to verify the server
+# certificate. If this option is set to True, swiftclient won't check
+# for a valid SSL certificate when authenticating. If the option is
+# set
+# to False, then the default CA truststore is used for verification.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * swift_store_cacert
+#
+# (boolean value)
+#swift_store_auth_insecure = false
+
+#
+# Path to the CA bundle file.
+#
+# This configuration option enables the operator to specify the path
+# to
+# a custom Certificate Authority file for SSL verification when
+# connecting to Swift.
+#
+# Possible values:
+# * A valid path to a CA file
+#
+# Related options:
+# * swift_store_auth_insecure
+#
+# (string value)
+#swift_store_cacert = /etc/ssl/certs/ca-certificates.crt
+
+#
+# The region of Swift endpoint to use by Glance.
+#
+# Provide a string value representing a Swift region where Glance
+# can connect to for image storage. By default, there is no region
+# set.
+#
+# When Glance uses Swift as the storage backend to store images
+# for a specific tenant that has multiple endpoints, setting of a
+# Swift region with ``swift_store_region`` allows Glance to connect
+# to Swift in the specified region as opposed to a single region
+# connectivity.
+#
+# This option can be configured for both single-tenant and
+# multi-tenant storage.
+#
+# NOTE: Setting the region with ``swift_store_region`` is
+# tenant-specific and is necessary ``only if`` the tenant has
+# multiple endpoints across different regions.
+#
+# Possible values:
+# * A string value representing a valid Swift region.
+#
+# Related Options:
+# * None
+#
+# (string value)
+#swift_store_region = RegionTwo
+
+#
+# The URL endpoint to use for Swift backend storage.
+#
+# Provide a string value representing the URL endpoint to use for
+# storing Glance images in Swift store. By default, an endpoint
+# is not set and the storage URL returned by ``auth`` is used.
+# Setting an endpoint with ``swift_store_endpoint`` overrides the
+# storage URL and is used for Glance image storage.
+#
+# NOTE: The URL should include the path up to, but excluding the
+# container. The location of an object is obtained by appending
+# the container and object to the configured URL.
+#
+# Possible values:
+# * String value representing a valid URL path up to a Swift
+# container
+#
+# Related Options:
+# * None
+#
+# (string value)
+#swift_store_endpoint = https://swift.openstack.example.org/v1/path_not_including_container_name
+
+#
+# Endpoint Type of Swift service.
+#
+# This string value indicates the endpoint type to use to fetch the
+# Swift endpoint. The endpoint type determines the actions the user
+# will
+# be allowed to perform, for instance, reading and writing to the
+# Store.
+# This setting is only used if swift_store_auth_version is greater
+# than
+# 1.
+#
+# Possible values:
+# * publicURL
+# * adminURL
+# * internalURL
+#
+# Related options:
+# * swift_store_endpoint
+#
+# (string value)
+# Possible values:
+# publicURL - <No description provided>
+# adminURL - <No description provided>
+# internalURL - <No description provided>
+#swift_store_endpoint_type = publicURL
+
+#
+# Type of Swift service to use.
+#
+# Provide a string value representing the service type to use for
+# storing images while using Swift backend storage. The default
+# service type is set to ``object-store``.
+#
+# NOTE: If ``swift_store_auth_version`` is set to 2, the value for
+# this configuration option needs to be ``object-store``. If using
+# a higher version of Keystone or a different auth scheme, this
+# option may be modified.
+#
+# Possible values:
+# * A string representing a valid service type for Swift storage.
+#
+# Related Options:
+# * None
+#
+# (string value)
+#swift_store_service_type = object-store
+
+#
+# Name of single container to store images/name prefix for multiple
+# containers
+#
+# When a single container is being used to store images, this
+# configuration
+# option indicates the container within the Glance account to be used
+# for
+# storing all images. When multiple containers are used to store
+# images, this
+# will be the name prefix for all containers. Usage of single/multiple
+# containers can be controlled using the configuration option
+# ``swift_store_multiple_containers_seed``.
+#
+# When using multiple containers, the containers will be named after
+# the value
+# set for this configuration option with the first N chars of the
+# image UUID
+# as the suffix delimited by an underscore (where N is specified by
+# ``swift_store_multiple_containers_seed``).
+#
+# Example: if the seed is set to 3 and swift_store_container =
+# ``glance``, then
+# an image with UUID ``fdae39a1-bac5-4238-aba4-69bcc726e848`` would be
+# placed in
+# the container ``glance_fda``. All dashes in the UUID are included
+# when
+# creating the container name but do not count toward the character
+# limit, so
+# when N=10 the container name would be ``glance_fdae39a1-ba.``
+#
+# Possible values:
+# * If using single container, this configuration option can be
+# any string
+# that is a valid swift container name in Glance's Swift account
+# * If using multiple containers, this configuration option can be
+# any
+# string as long as it satisfies the container naming rules
+# enforced by
+# Swift. The value of ``swift_store_multiple_containers_seed``
+# should be
+# taken into account as well.
+#
+# Related options:
+# * ``swift_store_multiple_containers_seed``
+# * ``swift_store_multi_tenant``
+# * ``swift_store_create_container_on_put``
+#
+# (string value)
+#swift_store_container = glance
+
+#
+# The size threshold, in MB, after which Glance will start segmenting
+# image data.
+#
+# Swift has an upper limit on the size of a single uploaded object. By
+# default,
+# this is 5GB. To upload objects bigger than this limit, objects are
+# segmented
+# into multiple smaller objects that are tied together with a manifest
+# file.
+# For more detail, refer to
+# http://docs.openstack.org/developer/swift/overview_large_objects.html
+#
+# This configuration option specifies the size threshold over which
+# the Swift
+# driver will start segmenting image data into multiple smaller files.
+# Currently, the Swift driver only supports creating Dynamic Large
+# Objects.
+#
+# NOTE: This should be set by taking into account the large object
+# limit
+# enforced by the Swift cluster in consideration.
+#
+# Possible values:
+# * A positive integer that is less than or equal to the large
+# object limit
+# enforced by the Swift cluster in consideration.
+#
+# Related options:
+# * ``swift_store_large_object_chunk_size``
+#
+# (integer value)
+# Minimum value: 1
+#swift_store_large_object_size = 5120
+
+#
+# The maximum size, in MB, of the segments when image data is
+# segmented.
+#
+# When image data is segmented to upload images that are larger than
+# the limit
+# enforced by the Swift cluster, image data is broken into segments
+# that are no
+# bigger than the size specified by this configuration option.
+# Refer to ``swift_store_large_object_size`` for more detail.
+#
+# For example: if ``swift_store_large_object_size`` is 5GB and
+# ``swift_store_large_object_chunk_size`` is 1GB, an image of size
+# 6.2GB will be
+# segmented into 7 segments where the first six segments will be 1GB
+# in size and
+# the seventh segment will be 0.2GB.
+#
+# Possible values:
+# * A positive integer that is less than or equal to the large
+# object limit
+# enforced by Swift cluster in consideration.
+#
+# Related options:
+# * ``swift_store_large_object_size``
+#
+# (integer value)
+# Minimum value: 1
+#swift_store_large_object_chunk_size = 200
+
+#
+# Create container, if it doesn't already exist, when uploading image.
+#
+# At the time of uploading an image, if the corresponding container
+# doesn't
+# exist, it will be created provided this configuration option is set
+# to True.
+# By default, it won't be created. This behavior is applicable for
+# both single
+# and multiple containers mode.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * None
+#
+# (boolean value)
+#swift_store_create_container_on_put = false
+
+#
+# Store images in tenant's Swift account.
+#
+# This enables multi-tenant storage mode which causes Glance images to
+# be stored
+# in tenant specific Swift accounts. If this is disabled, Glance
+# stores all
+# images in its own account. More details multi-tenant store can be
+# found at
+# https://wiki.openstack.org/wiki/GlanceSwiftTenantSpecificStorage
+#
+# NOTE: If using multi-tenant swift store, please make sure
+# that you do not set a swift configuration file with the
+# 'swift_store_config_file' option.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * swift_store_config_file
+#
+# (boolean value)
+#swift_store_multi_tenant = false
+
+#
+# Seed indicating the number of containers to use for storing images.
+#
+# When using a single-tenant store, images can be stored in one or
+# more than one
+# containers. When set to 0, all images will be stored in one single
+# container.
+# When set to an integer value between 1 and 32, multiple containers
+# will be
+# used to store images. This configuration option will determine how
+# many
+# containers are created. The total number of containers that will be
+# used is
+# equal to 16^N, so if this config option is set to 2, then 16^2=256
+# containers
+# will be used to store images.
+#
+# Please refer to ``swift_store_container`` for more detail on the
+# naming
+# convention. More detail about using multiple containers can be found
+# at
+# https://specs.openstack.org/openstack/glance-specs/specs/kilo/swift-
+# store-multiple-containers.html
+#
+# NOTE: This is used only when swift_store_multi_tenant is disabled.
+#
+# Possible values:
+# * A non-negative integer less than or equal to 32
+#
+# Related options:
+# * ``swift_store_container``
+# * ``swift_store_multi_tenant``
+# * ``swift_store_create_container_on_put``
+#
+# (integer value)
+# Minimum value: 0
+# Maximum value: 32
+#swift_store_multiple_containers_seed = 0
+
+#
+# List of tenants that will be granted admin access.
+#
+# This is a list of tenants that will be granted read/write access on
+# all Swift containers created by Glance in multi-tenant mode. The
+# default value is an empty list.
+#
+# Possible values:
+# * A comma separated list of strings representing UUIDs of
+# Keystone
+# projects/tenants
+#
+# Related options:
+# * None
+#
+# (list value)
+#swift_store_admin_tenants =
+
+#
+# SSL layer compression for HTTPS Swift requests.
+#
+# Provide a boolean value to determine whether or not to compress
+# HTTPS Swift requests for images at the SSL layer. By default,
+# compression is enabled.
+#
+# When using Swift as the backend store for Glance image storage,
+# SSL layer compression of HTTPS Swift requests can be set using
+# this option. If set to False, SSL layer compression of HTTPS
+# Swift requests is disabled. Disabling this option may improve
+# performance for images which are already in a compressed format,
+# for example, qcow2.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related Options:
+# * None
+#
+# (boolean value)
+#swift_store_ssl_compression = true
+
+#
+# The number of times a Swift download will be retried before the
+# request fails.
+#
+# Provide an integer value representing the number of times an image
+# download must be retried before erroring out. The default value is
+# zero (no retry on a failed image download). When set to a positive
+# integer value, ``swift_store_retry_get_count`` ensures that the
+# download is attempted this many more times upon a download failure
+# before sending an error message.
+#
+# Possible values:
+# * Zero
+# * Positive integer value
+#
+# Related Options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+#swift_store_retry_get_count = 0
+
+#
+# Time in seconds defining the size of the window in which a new
+# token may be requested before the current token is due to expire.
+#
+# Typically, the Swift storage driver fetches a new token upon the
+# expiration of the current token to ensure continued access to
+# Swift. However, some Swift transactions (like uploading image
+# segments) may not recover well if the token expires on the fly.
+#
+# Hence, by fetching a new token before the current token expiration,
+# we make sure that the token does not expire or is close to expiry
+# before a transaction is attempted. By default, the Swift storage
+# driver requests for a new token 60 seconds or less before the
+# current token expiration.
+#
+# Possible values:
+# * Zero
+# * Positive integer value
+#
+# Related Options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+#swift_store_expire_soon_interval = 60
+
+#
+# Use trusts for multi-tenant Swift store.
+#
+# This option instructs the Swift store to create a trust for each
+# add/get request when the multi-tenant store is in use. Using trusts
+# allows the Swift store to avoid problems that can be caused by an
+# authentication token expiring during the upload or download of data.
+#
+# By default, ``swift_store_use_trusts`` is set to ``True``(use of
+# trusts is enabled). If set to ``False``, a user token is used for
+# the Swift connection instead, eliminating the overhead of trust
+# creation.
+#
+# NOTE: This option is considered only when
+# ``swift_store_multi_tenant`` is set to ``True``
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * swift_store_multi_tenant
+#
+# (boolean value)
+#swift_store_use_trusts = true
+
+#
+# Buffer image segments before upload to Swift.
+#
+# Provide a boolean value to indicate whether or not Glance should
+# buffer image data to disk while uploading to swift. This enables
+# Glance to resume uploads on error.
+#
+# NOTES:
+# When enabling this option, one should take great care as this
+# increases disk usage on the API node. Be aware that depending
+# upon how the file system is configured, the disk space used
+# for buffering may decrease the actual disk space available for
+# the glance image cache. Disk utilization will cap according to
+# the following equation:
+# (``swift_store_large_object_chunk_size`` * ``workers`` * 1000)
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * swift_upload_buffer_dir
+#
+# (boolean value)
+#swift_buffer_on_upload = false
+
+#
+# Reference to default Swift account/backing store parameters.
+#
+# Provide a string value representing a reference to the default set
+# of parameters required for using swift account/backing store for
+# image storage. The default reference value for this configuration
+# option is 'ref1'. This configuration option dereferences the
+# parameters and facilitates image storage in Swift storage backend
+# every time a new image is added.
+#
+# Possible values:
+# * A valid string value
+#
+# Related options:
+# * None
+#
+# (string value)
+#default_swift_reference = ref1
+
+# DEPRECATED: Version of the authentication service to use. Valid
+# versions are 2 and 3 for keystone and 1 (deprecated) for swauth and
+# rackspace. (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason:
+# The option 'auth_version' in the Swift back-end configuration file
+# is
+# used instead.
+#swift_store_auth_version = 2
+
+# DEPRECATED: The address where the Swift authentication service is
+# listening. (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason:
+# The option 'auth_address' in the Swift back-end configuration file
+# is
+# used instead.
+#swift_store_auth_address = <None>
+
+# DEPRECATED: The user to authenticate against the Swift
+# authentication service. (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason:
+# The option 'user' in the Swift back-end configuration file is set
+# instead.
+#swift_store_user = <None>
+
+# DEPRECATED: Auth key for the user authenticating against the Swift
+# authentication service. (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason:
+# The option 'key' in the Swift back-end configuration file is used
+# to set the authentication key instead.
+#swift_store_key = <None>
+
+#
+# Absolute path to the file containing the swift account(s)
+# configurations.
+#
+# Include a string value representing the path to a configuration
+# file that has references for each of the configured Swift
+# account(s)/backing stores. By default, no file path is specified
+# and customized Swift referencing is disabled. Configuring this
+# option is highly recommended while using Swift storage backend for
+# image storage as it avoids storage of credentials in the database.
+#
+# NOTE: Please do not configure this option if you have set
+# ``swift_store_multi_tenant`` to ``True``.
+#
+# Possible values:
+# * String value representing an absolute path on the glance-api
+# node
+#
+# Related options:
+# * swift_store_multi_tenant
+#
+# (string value)
+#swift_store_config_file = <None>
+
+#
+# Directory to buffer image segments before upload to Swift.
+#
+# Provide a string value representing the absolute path to the
+# directory on the glance node where image segments will be
+# buffered briefly before they are uploaded to swift.
+#
+# NOTES:
+# * This is required only when the configuration option
+# ``swift_buffer_on_upload`` is set to True.
+# * This directory should be provisioned keeping in mind the
+# ``swift_store_large_object_chunk_size`` and the maximum
+# number of images that could be uploaded simultaneously by
+# a given glance node.
+#
+# Possible values:
+# * String value representing an absolute directory path
+#
+# Related options:
+# * swift_buffer_on_upload
+# * swift_store_large_object_chunk_size
+#
+# (string value)
+#swift_upload_buffer_dir = <None>
+
+{% if server.identity.region is defined %}
+os_region_name = {{ server.identity.region }}
+{% endif %}
+
+{%- if server.storage is defined and server.storage.get('vmware', {}).get('enabled') %}
+{%- set _data = server.storage.vmware %}
+{%- include "glance/files/queens/stores/_vmware.conf" %}
+{%- endif %}
+
+[oslo_policy]
+{%- if server.oslo_policy is defined %}
+{%- set _data = server.oslo_policy %}
+{%- include "oslo_templates/files/queens/oslo/_policy.conf" %}
+{%- endif %}
+
diff --git a/glance/files/queens/glance-cache.conf.RedHat b/glance/files/queens/glance-cache.conf.RedHat
new file mode 120000
index 0000000..ac4c3d1
--- /dev/null
+++ b/glance/files/queens/glance-cache.conf.RedHat
@@ -0,0 +1 @@
+glance-cache.conf.Debian
\ No newline at end of file
diff --git a/glance/files/queens/glance-registry-paste.ini b/glance/files/queens/glance-registry-paste.ini
new file mode 100644
index 0000000..492dbc6
--- /dev/null
+++ b/glance/files/queens/glance-registry-paste.ini
@@ -0,0 +1,35 @@
+# Use this pipeline for no auth - DEFAULT
+[pipeline:glance-registry]
+pipeline = healthcheck osprofiler unauthenticated-context registryapp
+
+# Use this pipeline for keystone auth
+[pipeline:glance-registry-keystone]
+pipeline = healthcheck osprofiler authtoken context registryapp
+
+# Use this pipeline for authZ only. This means that the registry will treat a
+# user as authenticated without making requests to keystone to reauthenticate
+# the user.
+[pipeline:glance-registry-trusted-auth]
+pipeline = healthcheck osprofiler context registryapp
+
+[app:registryapp]
+paste.app_factory = glance.registry.api:API.factory
+
+[filter:healthcheck]
+paste.filter_factory = oslo_middleware:Healthcheck.factory
+backends = disable_by_file
+disable_by_file_path = /etc/glance/healthcheck_disable
+
+[filter:context]
+paste.filter_factory = glance.api.middleware.context:ContextMiddleware.factory
+
+[filter:unauthenticated-context]
+paste.filter_factory = glance.api.middleware.context:UnauthenticatedContextMiddleware.factory
+
+[filter:authtoken]
+paste.filter_factory = keystonemiddleware.auth_token:filter_factory
+
+[filter:osprofiler]
+paste.filter_factory = osprofiler.web:WsgiMiddleware.factory
+hmac_keys = SECRET_KEY #DEPRECATED
+enabled = yes #DEPRECATED
diff --git a/glance/files/queens/glance-registry.conf.Debian b/glance/files/queens/glance-registry.conf.Debian
new file mode 100644
index 0000000..09e6620
--- /dev/null
+++ b/glance/files/queens/glance-registry.conf.Debian
@@ -0,0 +1,1097 @@
+{%- from "glance/map.jinja" import server with context %}
+[DEFAULT]
+
+#
+# From glance.registry
+#
+
+#
+# Set the image owner to tenant or the authenticated user.
+#
+# Assign a boolean value to determine the owner of an image. When set
+# to
+# True, the owner of the image is the tenant. When set to False, the
+# owner of the image will be the authenticated user issuing the
+# request.
+# Setting it to False makes the image private to the associated user
+# and
+# sharing with other users within the same tenant (or "project")
+# requires explicit image sharing via image membership.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * None
+#
+# (boolean value)
+#owner_is_tenant = true
+
+#
+# Role used to identify an authenticated user as administrator.
+#
+# Provide a string value representing a Keystone role to identify an
+# administrative user. Users with this role will be granted
+# administrative privileges. The default value for this option is
+# 'admin'.
+#
+# Possible values:
+# * A string value which is a valid Keystone role
+#
+# Related options:
+# * None
+#
+# (string value)
+#admin_role = admin
+
+#
+# Allow limited access to unauthenticated users.
+#
+# Assign a boolean to determine API access for unathenticated
+# users. When set to False, the API cannot be accessed by
+# unauthenticated users. When set to True, unauthenticated users can
+# access the API with read-only privileges. This however only applies
+# when using ContextMiddleware.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * None
+#
+# (boolean value)
+#allow_anonymous_access = false
+
+#
+# Limit the request ID length.
+#
+# Provide an integer value to limit the length of the request ID to
+# the specified length. The default value is 64. Users can change this
+# to any ineteger value between 0 and 16384 however keeping in mind
+# that
+# a larger value may flood the logs.
+#
+# Possible values:
+# * Integer value between 0 and 16384
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+#max_request_id_length = 64
+
+#
+# Allow users to add additional/custom properties to images.
+#
+# Glance defines a standard set of properties (in its schema) that
+# appear on every image. These properties are also known as
+# ``base properties``. In addition to these properties, Glance
+# allows users to add custom properties to images. These are known
+# as ``additional properties``.
+#
+# By default, this configuration option is set to ``True`` and users
+# are allowed to add additional properties. The number of additional
+# properties that can be added to an image can be controlled via
+# ``image_property_quota`` configuration option.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * image_property_quota
+#
+# (boolean value)
+#allow_additional_image_properties = true
+
+#
+# Maximum number of image members per image.
+#
+# This limits the maximum of users an image can be shared with. Any
+# negative
+# value is interpreted as unlimited.
+#
+# Related options:
+# * None
+#
+# (integer value)
+#image_member_quota = 128
+
+#
+# Maximum number of properties allowed on an image.
+#
+# This enforces an upper limit on the number of additional properties
+# an image
+# can have. Any negative value is interpreted as unlimited.
+#
+# NOTE: This won't have any impact if additional properties are
+# disabled. Please
+# refer to ``allow_additional_image_properties``.
+#
+# Related options:
+# * ``allow_additional_image_properties``
+#
+# (integer value)
+#image_property_quota = 128
+
+#
+# Maximum number of tags allowed on an image.
+#
+# Any negative value is interpreted as unlimited.
+#
+# Related options:
+# * None
+#
+# (integer value)
+#image_tag_quota = 128
+
+#
+# Maximum number of locations allowed on an image.
+#
+# Any negative value is interpreted as unlimited.
+#
+# Related options:
+# * None
+#
+# (integer value)
+#image_location_quota = 10
+
+# DEPRECATED:
+# Python module path of data access API.
+#
+# Specifies the path to the API to use for accessing the data model.
+# This option determines how the image catalog data will be accessed.
+#
+# Possible values:
+# * glance.db.sqlalchemy.api
+# * glance.db.registry.api
+# * glance.db.simple.api
+#
+# If this option is set to ``glance.db.sqlalchemy.api`` then the image
+# catalog data is stored in and read from the database via the
+# SQLAlchemy Core and ORM APIs.
+#
+# Setting this option to ``glance.db.registry.api`` will force all
+# database access requests to be routed through the Registry service.
+# This avoids data access from the Glance API nodes for an added layer
+# of security, scalability and manageability.
+#
+# NOTE: In v2 OpenStack Images API, the registry service is optional.
+# In order to use the Registry API in v2, the option
+# ``enable_v2_registry`` must be set to ``True``.
+#
+# Finally, when this configuration option is set to
+# ``glance.db.simple.api``, image catalog data is stored in and read
+# from an in-memory data structure. This is primarily used for
+# testing.
+#
+# Related options:
+# * enable_v2_api
+# * enable_v2_registry
+#
+# (string value)
+# This option is deprecated for removal since Queens.
+# Its value may be silently ignored in the future.
+# Reason:
+# Glance registry service is deprecated for removal.
+#
+# More information can be found from the spec:
+# http://specs.openstack.org/openstack/glance-
+# specs/specs/queens/approved/glance/deprecate-registry.html
+#data_api = glance.db.sqlalchemy.api
+
+#
+# The default number of results to return for a request.
+#
+# Responses to certain API requests, like list images, may return
+# multiple items. The number of results returned can be explicitly
+# controlled by specifying the ``limit`` parameter in the API request.
+# However, if a ``limit`` parameter is not specified, this
+# configuration value will be used as the default number of results to
+# be returned for any API request.
+#
+# NOTES:
+# * The value of this configuration option may not be greater than
+# the value specified by ``api_limit_max``.
+# * Setting this to a very large value may slow down database
+# queries and increase response times. Setting this to a
+# very low value may result in poor user experience.
+#
+# Possible values:
+# * Any positive integer
+#
+# Related options:
+# * api_limit_max
+#
+# (integer value)
+# Minimum value: 1
+#limit_param_default = 25
+{%- if server.limit_param_default is defined %}
+limit_param_default = {{ server.limit_param_default }}
+{%- endif %}
+
+#
+# Maximum number of results that could be returned by a request.
+#
+# As described in the help text of ``limit_param_default``, some
+# requests may return multiple results. The number of results to be
+# returned are governed either by the ``limit`` parameter in the
+# request or the ``limit_param_default`` configuration option.
+# The value in either case, can't be greater than the absolute maximum
+# defined by this configuration option. Anything greater than this
+# value is trimmed down to the maximum value defined here.
+#
+# NOTE: Setting this to a very large value may slow down database
+# queries and increase response times. Setting this to a
+# very low value may result in poor user experience.
+#
+# Possible values:
+# * Any positive integer
+#
+# Related options:
+# * limit_param_default
+#
+# (integer value)
+# Minimum value: 1
+#api_limit_max = 1000
+{%- if server.api_limit_max is defined %}
+api_limit_max = {{ server.api_limit_max }}
+{%- endif %}
+
+#
+# Show direct image location when returning an image.
+#
+# This configuration option indicates whether to show the direct image
+# location when returning image details to the user. The direct image
+# location is where the image data is stored in backend storage. This
+# image location is shown under the image property ``direct_url``.
+#
+# When multiple image locations exist for an image, the best location
+# is displayed based on the location strategy indicated by the
+# configuration option ``location_strategy``.
+#
+# NOTES:
+# * Revealing image locations can present a GRAVE SECURITY RISK as
+# image locations can sometimes include credentials. Hence, this
+# is set to ``False`` by default. Set this to ``True`` with
+# EXTREME CAUTION and ONLY IF you know what you are doing!
+# * If an operator wishes to avoid showing any image location(s)
+# to the user, then both this option and
+# ``show_multiple_locations`` MUST be set to ``False``.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * show_multiple_locations
+# * location_strategy
+#
+# (boolean value)
+#show_image_direct_url = false
+
+# DEPRECATED:
+# Show all image locations when returning an image.
+#
+# This configuration option indicates whether to show all the image
+# locations when returning image details to the user. When multiple
+# image locations exist for an image, the locations are ordered based
+# on the location strategy indicated by the configuration opt
+# ``location_strategy``. The image locations are shown under the
+# image property ``locations``.
+#
+# NOTES:
+# * Revealing image locations can present a GRAVE SECURITY RISK as
+# image locations can sometimes include credentials. Hence, this
+# is set to ``False`` by default. Set this to ``True`` with
+# EXTREME CAUTION and ONLY IF you know what you are doing!
+# * If an operator wishes to avoid showing any image location(s)
+# to the user, then both this option and
+# ``show_image_direct_url`` MUST be set to ``False``.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * show_image_direct_url
+# * location_strategy
+#
+# (boolean value)
+# This option is deprecated for removal since Newton.
+# Its value may be silently ignored in the future.
+# Reason: This option will be removed in the Pike release or later
+# because the same functionality can be achieved with greater
+# granularity by using policies. Please see the Newton release notes
+# for more information.
+#show_multiple_locations = false
+
+#
+# Maximum size of image a user can upload in bytes.
+#
+# An image upload greater than the size mentioned here would result
+# in an image creation failure. This configuration option defaults to
+# 1099511627776 bytes (1 TiB).
+#
+# NOTES:
+# * This value should only be increased after careful
+# consideration and must be set less than or equal to
+# 8 EiB (9223372036854775808).
+# * This value must be set with careful consideration of the
+# backend storage capacity. Setting this to a very low value
+# may result in a large number of image failures. And, setting
+# this to a very large value may result in faster consumption
+# of storage. Hence, this must be set according to the nature of
+# images created and storage capacity available.
+#
+# Possible values:
+# * Any positive number less than or equal to 9223372036854775808
+#
+# (integer value)
+# Minimum value: 1
+# Maximum value: 9223372036854775808
+#image_size_cap = 1099511627776
+
+#
+# Maximum amount of image storage per tenant.
+#
+# This enforces an upper limit on the cumulative storage consumed by
+# all images
+# of a tenant across all stores. This is a per-tenant limit.
+#
+# The default unit for this configuration option is Bytes. However,
+# storage
+# units can be specified using case-sensitive literals ``B``, ``KB``,
+# ``MB``,
+# ``GB`` and ``TB`` representing Bytes, KiloBytes, MegaBytes,
+# GigaBytes and
+# TeraBytes respectively. Note that there should not be any space
+# between the
+# value and unit. Value ``0`` signifies no quota enforcement. Negative
+# values
+# are invalid and result in errors.
+#
+# Possible values:
+# * A string that is a valid concatenation of a non-negative
+# integer
+# representing the storage value and an optional string literal
+# representing storage units as mentioned above.
+#
+# Related options:
+# * None
+#
+# (string value)
+#user_storage_quota = 0
+
+#
+# Deploy the v1 OpenStack Images API.
+#
+# When this option is set to ``True``, Glance service will respond to
+# requests on registered endpoints conforming to the v1 OpenStack
+# Images API.
+#
+# NOTES:
+# * If this option is enabled, then ``enable_v1_registry`` must
+# also be set to ``True`` to enable mandatory usage of Registry
+# service with v1 API.
+#
+# * If this option is disabled, then the ``enable_v1_registry``
+# option, which is enabled by default, is also recommended
+# to be disabled.
+#
+# * This option is separate from ``enable_v2_api``, both v1 and v2
+# OpenStack Images API can be deployed independent of each
+# other.
+#
+# * If deploying only the v2 Images API, this option, which is
+# enabled by default, should be disabled.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * enable_v1_registry
+# * enable_v2_api
+#
+# (boolean value)
+#enable_v1_api = true
+
+#
+# Deploy the v2 OpenStack Images API.
+#
+# When this option is set to ``True``, Glance service will respond
+# to requests on registered endpoints conforming to the v2 OpenStack
+# Images API.
+#
+# NOTES:
+# * If this option is disabled, then the ``enable_v2_registry``
+# option, which is enabled by default, is also recommended
+# to be disabled.
+#
+# * This option is separate from ``enable_v1_api``, both v1 and v2
+# OpenStack Images API can be deployed independent of each
+# other.
+#
+# * If deploying only the v1 Images API, this option, which is
+# enabled by default, should be disabled.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * enable_v2_registry
+# * enable_v1_api
+#
+# (boolean value)
+#enable_v2_api = true
+
+#
+# Deploy the v1 API Registry service.
+#
+# When this option is set to ``True``, the Registry service
+# will be enabled in Glance for v1 API requests.
+#
+# NOTES:
+# * Use of Registry is mandatory in v1 API, so this option must
+# be set to ``True`` if the ``enable_v1_api`` option is enabled.
+#
+# * If deploying only the v2 OpenStack Images API, this option,
+# which is enabled by default, should be disabled.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * enable_v1_api
+#
+# (boolean value)
+#enable_v1_registry = true
+
+# DEPRECATED:
+# Deploy the v2 API Registry service.
+#
+# When this option is set to ``True``, the Registry service
+# will be enabled in Glance for v2 API requests.
+#
+# NOTES:
+# * Use of Registry is optional in v2 API, so this option
+# must only be enabled if both ``enable_v2_api`` is set to
+# ``True`` and the ``data_api`` option is set to
+# ``glance.db.registry.api``.
+#
+# * If deploying only the v1 OpenStack Images API, this option,
+# which is enabled by default, should be disabled.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * enable_v2_api
+# * data_api
+#
+# (boolean value)
+# This option is deprecated for removal since Queens.
+# Its value may be silently ignored in the future.
+# Reason:
+# Glance registry service is deprecated for removal.
+#
+# More information can be found from the spec:
+# http://specs.openstack.org/openstack/glance-
+# specs/specs/queens/approved/glance/deprecate-registry.html
+#enable_v2_registry = true
+
+#
+# Host address of the pydev server.
+#
+# Provide a string value representing the hostname or IP of the
+# pydev server to use for debugging. The pydev server listens for
+# debug connections on this address, facilitating remote debugging
+# in Glance.
+#
+# Possible values:
+# * Valid hostname
+# * Valid IP address
+#
+# Related options:
+# * None
+#
+# (unknown value)
+#pydev_worker_debug_host = localhost
+
+#
+# Port number that the pydev server will listen on.
+#
+# Provide a port number to bind the pydev server to. The pydev
+# process accepts debug connections on this port and facilitates
+# remote debugging in Glance.
+#
+# Possible values:
+# * A valid port number
+#
+# Related options:
+# * None
+#
+# (port value)
+# Minimum value: 0
+# Maximum value: 65535
+#pydev_worker_debug_port = 5678
+
+#
+# AES key for encrypting store location metadata.
+#
+# Provide a string value representing the AES cipher to use for
+# encrypting Glance store metadata.
+#
+# NOTE: The AES key to use must be set to a random string of length
+# 16, 24 or 32 bytes.
+#
+# Possible values:
+# * String value representing a valid AES key
+#
+# Related options:
+# * None
+#
+# (string value)
+#metadata_encryption_key = <None>
+
+#
+# Digest algorithm to use for digital signature.
+#
+# Provide a string value representing the digest algorithm to
+# use for generating digital signatures. By default, ``sha256``
+# is used.
+#
+# To get a list of the available algorithms supported by the version
+# of OpenSSL on your platform, run the command:
+# ``openssl list-message-digest-algorithms``.
+# Examples are 'sha1', 'sha256', and 'sha512'.
+#
+# NOTE: ``digest_algorithm`` is not related to Glance's image signing
+# and verification. It is only used to sign the universally unique
+# identifier (UUID) as a part of the certificate file and key file
+# validation.
+#
+# Possible values:
+# * An OpenSSL message digest algorithm identifier
+#
+# Relation options:
+# * None
+#
+# (string value)
+#digest_algorithm = sha256
+
+#
+# The URL provides location where the temporary data will be stored
+#
+# This option is for Glance internal use only. Glance will save the
+# image data uploaded by the user to 'staging' endpoint during the
+# image import process.
+#
+# This option does not change the 'staging' API endpoint by any means.
+#
+# NOTE: It is discouraged to use same path as [task]/work_dir
+#
+# NOTE: 'file://<absolute-directory-path>' is the only option
+# api_image_import flow will support for now.
+#
+# NOTE: The staging path must be on shared filesystem available to all
+# Glance API nodes.
+#
+# Possible values:
+# * String starting with 'file://' followed by absolute FS path
+#
+# Related options:
+# * [task]/work_dir
+# * [DEFAULT]/enable_image_import (*deprecated*)
+#
+# (string value)
+#node_staging_uri = file:///tmp/staging/
+
+# DEPRECATED:
+# Enables the Image Import workflow introduced in Pike
+#
+# As '[DEFAULT]/node_staging_uri' is required for the Image
+# Import, it's disabled per default in Pike, enabled per
+# default in Queens and removed in Rocky. This allows Glance to
+# operate with previous version configs upon upgrade.
+#
+# Setting this option to False will disable the endpoints related
+# to Image Import Refactoring work.
+#
+# Related options:
+# * [DEFAULT]/node_staging_uri (boolean value)
+# This option is deprecated for removal since Pike.
+# Its value may be silently ignored in the future.
+# Reason:
+# This option is deprecated for removal in Rocky.
+#
+# It was introduced to make sure that the API is not enabled
+# before the '[DEFAULT]/node_staging_uri' is defined and is
+# long term redundant.
+#enable_image_import = true
+
+#
+# List of enabled Image Import Methods
+#
+# Both 'glance-direct' and 'web-download' are enabled by default.
+#
+# Related options:
+# * [DEFAULT]/node_staging_uri
+# * [DEFAULT]/enable_image_import (list value)
+#enabled_import_methods = glance-direct,web-download
+
+#
+# IP address to bind the glance servers to.
+#
+# Provide an IP address to bind the glance server to. The default
+# value is ``0.0.0.0``.
+#
+# Edit this option to enable the server to listen on one particular
+# IP address on the network card. This facilitates selection of a
+# particular network interface for the server.
+#
+# Possible values:
+# * A valid IPv4 address
+# * A valid IPv6 address
+#
+# Related options:
+# * None
+#
+# (unknown value)
+#bind_host = 0.0.0.0
+bind_host = {{ server.bind.address }}
+
+#
+# Port number on which the server will listen.
+#
+# Provide a valid port number to bind the server's socket to. This
+# port is then set to identify processes and forward network messages
+# that arrive at the server. The default bind_port value for the API
+# server is 9292 and for the registry server is 9191.
+#
+# Possible values:
+# * A valid port number (0 to 65535)
+#
+# Related options:
+# * None
+#
+# (port value)
+# Minimum value: 0
+# Maximum value: 65535
+#bind_port = <None>
+bind_port = {{ server.registry.port }}
+
+#
+# Set the number of incoming connection requests.
+#
+# Provide a positive integer value to limit the number of requests in
+# the backlog queue. The default queue size is 4096.
+#
+# An incoming connection to a TCP listener socket is queued before a
+# connection can be established with the server. Setting the backlog
+# for a TCP socket ensures a limited queue size for incoming traffic.
+#
+# Possible values:
+# * Positive integer
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 1
+#backlog = 4096
+
+#
+# Set the wait time before a connection recheck.
+#
+# Provide a positive integer value representing time in seconds which
+# is set as the idle wait time before a TCP keep alive packet can be
+# sent to the host. The default value is 600 seconds.
+#
+# Setting ``tcp_keepidle`` helps verify at regular intervals that a
+# connection is intact and prevents frequent TCP connection
+# reestablishment.
+#
+# Possible values:
+# * Positive integer value representing time in seconds
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 1
+#tcp_keepidle = 600
+
+#
+# Absolute path to the CA file.
+#
+# Provide a string value representing a valid absolute path to
+# the Certificate Authority file to use for client authentication.
+#
+# A CA file typically contains necessary trusted certificates to
+# use for the client authentication. This is essential to ensure
+# that a secure connection is established to the server via the
+# internet.
+#
+# Possible values:
+# * Valid absolute path to the CA file
+#
+# Related options:
+# * None
+#
+# (string value)
+#ca_file = /etc/ssl/cafile
+
+#
+# Absolute path to the certificate file.
+#
+# Provide a string value representing a valid absolute path to the
+# certificate file which is required to start the API service
+# securely.
+#
+# A certificate file typically is a public key container and includes
+# the server's public key, server name, server information and the
+# signature which was a result of the verification process using the
+# CA certificate. This is required for a secure connection
+# establishment.
+#
+# Possible values:
+# * Valid absolute path to the certificate file
+#
+# Related options:
+# * None
+#
+# (string value)
+#cert_file = /etc/ssl/certs
+
+#
+# Absolute path to a private key file.
+#
+# Provide a string value representing a valid absolute path to a
+# private key file which is required to establish the client-server
+# connection.
+#
+# Possible values:
+# * Absolute path to the private key file
+#
+# Related options:
+# * None
+#
+# (string value)
+#key_file = /etc/ssl/key/key-file.pem
+
+# DEPRECATED: The HTTP header used to determine the scheme for the
+# original request, even if it was removed by an SSL terminating
+# proxy. Typical value is "HTTP_X_FORWARDED_PROTO". (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason: Use the http_proxy_to_wsgi middleware instead.
+#secure_proxy_ssl_header = <None>
+
+#
+# Number of Glance worker processes to start.
+#
+# Provide a non-negative integer value to set the number of child
+# process workers to service requests. By default, the number of CPUs
+# available is set as the value for ``workers`` limited to 8. For
+# example if the processor count is 6, 6 workers will be used, if the
+# processor count is 24 only 8 workers will be used. The limit will
+# only
+# apply to the default value, if 24 workers is configured, 24 is used.
+#
+# Each worker process is made to listen on the port set in the
+# configuration file and contains a greenthread pool of size 1000.
+#
+# NOTE: Setting the number of workers to zero, triggers the creation
+# of a single API process with a greenthread pool of size 1000.
+#
+# Possible values:
+# * 0
+# * Positive integer value (typically equal to the number of CPUs)
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+#workers = <None>
+workers = {{ server.workers }}
+
+#
+# Maximum line size of message headers.
+#
+# Provide an integer value representing a length to limit the size of
+# message headers. The default value is 16384.
+#
+# NOTE: ``max_header_line`` may need to be increased when using large
+# tokens (typically those generated by the Keystone v3 API with big
+# service catalogs). However, it is to be kept in mind that larger
+# values for ``max_header_line`` would flood the logs.
+#
+# Setting ``max_header_line`` to 0 sets no limit for the line size of
+# message headers.
+#
+# Possible values:
+# * 0
+# * Positive integer
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+#max_header_line = 16384
+
+#
+# Set keep alive option for HTTP over TCP.
+#
+# Provide a boolean value to determine sending of keep alive packets.
+# If set to ``False``, the server returns the header
+# "Connection: close". If set to ``True``, the server returns a
+# "Connection: Keep-Alive" in its responses. This enables retention of
+# the same TCP connection for HTTP conversations instead of opening a
+# new one with each new request.
+#
+# This option must be set to ``False`` if the client socket connection
+# needs to be closed explicitly after the response is received and
+# read successfully by the client.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * None
+#
+# (boolean value)
+#http_keepalive = true
+
+#
+# Timeout for client connections' socket operations.
+#
+# Provide a valid integer value representing time in seconds to set
+# the period of wait before an incoming connection can be closed. The
+# default value is 900 seconds.
+#
+# The value zero implies wait forever.
+#
+# Possible values:
+# * Zero
+# * Positive integer
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+#client_socket_timeout = 900
+
+{%- if server.logging is defined %}
+{%- set _data = server.logging %}
+{%- do _data.update({'log_file': '/var/log/glance/registry.log'}) %}
+{%- include "oslo_templates/files/queens/oslo/_log.conf" %}
+{%- endif %}
+
+[paste_deploy]
+
+#
+# From glance.registry
+#
+
+#
+# Deployment flavor to use in the server application pipeline.
+#
+# Provide a string value representing the appropriate deployment
+# flavor used in the server application pipleline. This is typically
+# the partial name of a pipeline in the paste configuration file with
+# the service name removed.
+#
+# For example, if your paste section name in the paste configuration
+# file is [pipeline:glance-api-keystone], set ``flavor`` to
+# ``keystone``.
+#
+# Possible values:
+# * String value representing a partial pipeline name.
+#
+# Related Options:
+# * config_file
+#
+# (string value)
+{%- if server.get('flavor', 'keystone') %}
+flavor = {{ server.get('flavor', 'keystone') }}
+{%- endif %}
+
+#
+# Name of the paste configuration file.
+#
+# Provide a string value representing the name of the paste
+# configuration file to use for configuring piplelines for
+# server application deployments.
+#
+# NOTES:
+# * Provide the name or the path relative to the glance directory
+# for the paste configuration file and not the absolute path.
+# * The sample paste configuration file shipped with Glance need
+# not be edited in most cases as it comes with ready-made
+# pipelines for all common deployment flavors.
+#
+# If no value is specified for this option, the ``paste.ini`` file
+# with the prefix of the corresponding Glance service's configuration
+# file name will be searched for in the known configuration
+# directories. (For example, if this option is missing from or has no
+# value set in ``glance-api.conf``, the service will look for a file
+# named ``glance-api-paste.ini``.) If the paste configuration file is
+# not found, the service will not start.
+#
+# Possible values:
+# * A string value representing the name of the paste
+# configuration
+# file.
+#
+# Related Options:
+# * flavor
+#
+# (string value)
+#config_file = glance-api-paste.ini
+
+
+[profiler]
+
+#
+# From glance.registry
+#
+
+#
+# Enables the profiling for all services on this node. Default value
+# is False
+# (fully disable the profiling feature).
+#
+# Possible values:
+#
+# * True: Enables the feature
+# * False: Disables the feature. The profiling cannot be started via
+# this project
+# operations. If the profiling is triggered by another project, this
+# project part
+# will be empty.
+# (boolean value)
+# Deprecated group/name - [profiler]/profiler_enabled
+#enabled = false
+
+#
+# Enables SQL requests profiling in services. Default value is False
+# (SQL
+# requests won't be traced).
+#
+# Possible values:
+#
+# * True: Enables SQL requests profiling. Each SQL query will be part
+# of the
+# trace and can the be analyzed by how much time was spent for that.
+# * False: Disables SQL requests profiling. The spent time is only
+# shown on a
+# higher level of operations. Single SQL queries cannot be analyzed
+# this
+# way.
+# (boolean value)
+#trace_sqlalchemy = false
+
+#
+# Secret key(s) to use for encrypting context data for performance
+# profiling.
+# This string value should have the following format:
+# <key1>[,<key2>,...<keyn>],
+# where each key is some random string. A user who triggers the
+# profiling via
+# the REST API has to set one of these keys in the headers of the REST
+# API call
+# to include profiling results of this node for this particular
+# project.
+#
+# Both "enabled" flag and "hmac_keys" config options should be set to
+# enable
+# profiling. Also, to generate correct profiling information across
+# all services
+# at least one key needs to be consistent between OpenStack projects.
+# This
+# ensures it can be used from client side to generate the trace,
+# containing
+# information from all possible resources. (string value)
+#hmac_keys = SECRET_KEY
+
+#
+# Connection string for a notifier backend. Default value is
+# messaging:// which
+# sets the notifier to oslo_messaging.
+#
+# Examples of possible values:
+#
+# * messaging://: use oslo_messaging driver for sending notifications.
+# * mongodb://127.0.0.1:27017 : use mongodb driver for sending
+# notifications.
+# * elasticsearch://127.0.0.1:9200 : use elasticsearch driver for
+# sending
+# notifications.
+# (string value)
+#connection_string = messaging://
+
+#
+# Document type for notification indexing in elasticsearch.
+# (string value)
+#es_doc_type = notification
+
+#
+# This parameter is a time value parameter (for example:
+# es_scroll_time=2m),
+# indicating for how long the nodes that participate in the search
+# will maintain
+# relevant resources in order to continue and support it.
+# (string value)
+#es_scroll_time = 2m
+
+#
+# Elasticsearch splits large requests in batches. This parameter
+# defines
+# maximum size of each batch (for example: es_scroll_size=10000).
+# (integer value)
+#es_scroll_size = 10000
+
+#
+# Redissentinel provides a timeout option on the connections.
+# This parameter defines that timeout (for example:
+# socket_timeout=0.1).
+# (floating point value)
+#socket_timeout = 0.1
+
+#
+# Redissentinel uses a service name to identify a master redis
+# service.
+# This parameter defines the name (for example:
+# sentinal_service_name=mymaster).
+# (string value)
+#sentinel_service_name = mymaster
+
+[database]
+{%- set _data = server.database %}
+{%- if _data.ssl is defined and 'cacert_file' not in _data.get('ssl', {}).keys() %}{% do _data['ssl'].update({'cacert_file': server.cacert_file}) %}{% endif %}
+{%- include "oslo_templates/files/queens/oslo/_database.conf" %}
+
+[oslo_policy]
+{%- if server.oslo_policy is defined %}
+{%- set _data = server.oslo_policy %}
+{%- include "oslo_templates/files/queens/oslo/_policy.conf" %}
+{%- endif %}
+
+[keystone_authtoken]
+{%- set _data = server.identity %}
+{%- if 'cacert_file' not in _data.keys() %}{% do _data.update({'cacert_file': server.cacert_file}) %}{% endif %}
+{%- set auth_type = _data.get('auth_type', 'password') %}
+{%- include "oslo_templates/files/queens/keystonemiddleware/_auth_token.conf" %}
+{%- include "oslo_templates/files/queens/keystoneauth/_type_" + auth_type + ".conf" %}
diff --git a/glance/files/queens/glance-registry.conf.RedHat b/glance/files/queens/glance-registry.conf.RedHat
new file mode 120000
index 0000000..a4170b8
--- /dev/null
+++ b/glance/files/queens/glance-registry.conf.RedHat
@@ -0,0 +1 @@
+glance-registry.conf.Debian
\ No newline at end of file
diff --git a/glance/files/queens/glance-scrubber.conf.Debian b/glance/files/queens/glance-scrubber.conf.Debian
new file mode 100644
index 0000000..7bd8e6b
--- /dev/null
+++ b/glance/files/queens/glance-scrubber.conf.Debian
@@ -0,0 +1,2280 @@
+{%- from "glance/map.jinja" import server with context %}
+[DEFAULT]
+
+#
+# From glance.scrubber
+#
+
+#
+# Allow users to add additional/custom properties to images.
+#
+# Glance defines a standard set of properties (in its schema) that
+# appear on every image. These properties are also known as
+# ``base properties``. In addition to these properties, Glance
+# allows users to add custom properties to images. These are known
+# as ``additional properties``.
+#
+# By default, this configuration option is set to ``True`` and users
+# are allowed to add additional properties. The number of additional
+# properties that can be added to an image can be controlled via
+# ``image_property_quota`` configuration option.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * image_property_quota
+#
+# (boolean value)
+#allow_additional_image_properties = true
+
+#
+# Maximum number of image members per image.
+#
+# This limits the maximum of users an image can be shared with. Any
+# negative
+# value is interpreted as unlimited.
+#
+# Related options:
+# * None
+#
+# (integer value)
+#image_member_quota = 128
+
+#
+# Maximum number of properties allowed on an image.
+#
+# This enforces an upper limit on the number of additional properties
+# an image
+# can have. Any negative value is interpreted as unlimited.
+#
+# NOTE: This won't have any impact if additional properties are
+# disabled. Please
+# refer to ``allow_additional_image_properties``.
+#
+# Related options:
+# * ``allow_additional_image_properties``
+#
+# (integer value)
+#image_property_quota = 128
+
+#
+# Maximum number of tags allowed on an image.
+#
+# Any negative value is interpreted as unlimited.
+#
+# Related options:
+# * None
+#
+# (integer value)
+#image_tag_quota = 128
+
+#
+# Maximum number of locations allowed on an image.
+#
+# Any negative value is interpreted as unlimited.
+#
+# Related options:
+# * None
+#
+# (integer value)
+#image_location_quota = 10
+
+# DEPRECATED:
+# Python module path of data access API.
+#
+# Specifies the path to the API to use for accessing the data model.
+# This option determines how the image catalog data will be accessed.
+#
+# Possible values:
+# * glance.db.sqlalchemy.api
+# * glance.db.registry.api
+# * glance.db.simple.api
+#
+# If this option is set to ``glance.db.sqlalchemy.api`` then the image
+# catalog data is stored in and read from the database via the
+# SQLAlchemy Core and ORM APIs.
+#
+# Setting this option to ``glance.db.registry.api`` will force all
+# database access requests to be routed through the Registry service.
+# This avoids data access from the Glance API nodes for an added layer
+# of security, scalability and manageability.
+#
+# NOTE: In v2 OpenStack Images API, the registry service is optional.
+# In order to use the Registry API in v2, the option
+# ``enable_v2_registry`` must be set to ``True``.
+#
+# Finally, when this configuration option is set to
+# ``glance.db.simple.api``, image catalog data is stored in and read
+# from an in-memory data structure. This is primarily used for
+# testing.
+#
+# Related options:
+# * enable_v2_api
+# * enable_v2_registry
+#
+# (string value)
+# This option is deprecated for removal since Queens.
+# Its value may be silently ignored in the future.
+# Reason:
+# Glance registry service is deprecated for removal.
+#
+# More information can be found from the spec:
+# http://specs.openstack.org/openstack/glance-
+# specs/specs/queens/approved/glance/deprecate-registry.html
+#data_api = glance.db.sqlalchemy.api
+
+#
+# The default number of results to return for a request.
+#
+# Responses to certain API requests, like list images, may return
+# multiple items. The number of results returned can be explicitly
+# controlled by specifying the ``limit`` parameter in the API request.
+# However, if a ``limit`` parameter is not specified, this
+# configuration value will be used as the default number of results to
+# be returned for any API request.
+#
+# NOTES:
+# * The value of this configuration option may not be greater than
+# the value specified by ``api_limit_max``.
+# * Setting this to a very large value may slow down database
+# queries and increase response times. Setting this to a
+# very low value may result in poor user experience.
+#
+# Possible values:
+# * Any positive integer
+#
+# Related options:
+# * api_limit_max
+#
+# (integer value)
+# Minimum value: 1
+#limit_param_default = 25
+
+#
+# Maximum number of results that could be returned by a request.
+#
+# As described in the help text of ``limit_param_default``, some
+# requests may return multiple results. The number of results to be
+# returned are governed either by the ``limit`` parameter in the
+# request or the ``limit_param_default`` configuration option.
+# The value in either case, can't be greater than the absolute maximum
+# defined by this configuration option. Anything greater than this
+# value is trimmed down to the maximum value defined here.
+#
+# NOTE: Setting this to a very large value may slow down database
+# queries and increase response times. Setting this to a
+# very low value may result in poor user experience.
+#
+# Possible values:
+# * Any positive integer
+#
+# Related options:
+# * limit_param_default
+#
+# (integer value)
+# Minimum value: 1
+#api_limit_max = 1000
+
+#
+# Show direct image location when returning an image.
+#
+# This configuration option indicates whether to show the direct image
+# location when returning image details to the user. The direct image
+# location is where the image data is stored in backend storage. This
+# image location is shown under the image property ``direct_url``.
+#
+# When multiple image locations exist for an image, the best location
+# is displayed based on the location strategy indicated by the
+# configuration option ``location_strategy``.
+#
+# NOTES:
+# * Revealing image locations can present a GRAVE SECURITY RISK as
+# image locations can sometimes include credentials. Hence, this
+# is set to ``False`` by default. Set this to ``True`` with
+# EXTREME CAUTION and ONLY IF you know what you are doing!
+# * If an operator wishes to avoid showing any image location(s)
+# to the user, then both this option and
+# ``show_multiple_locations`` MUST be set to ``False``.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * show_multiple_locations
+# * location_strategy
+#
+# (boolean value)
+#show_image_direct_url = false
+
+# DEPRECATED:
+# Show all image locations when returning an image.
+#
+# This configuration option indicates whether to show all the image
+# locations when returning image details to the user. When multiple
+# image locations exist for an image, the locations are ordered based
+# on the location strategy indicated by the configuration opt
+# ``location_strategy``. The image locations are shown under the
+# image property ``locations``.
+#
+# NOTES:
+# * Revealing image locations can present a GRAVE SECURITY RISK as
+# image locations can sometimes include credentials. Hence, this
+# is set to ``False`` by default. Set this to ``True`` with
+# EXTREME CAUTION and ONLY IF you know what you are doing!
+# * If an operator wishes to avoid showing any image location(s)
+# to the user, then both this option and
+# ``show_image_direct_url`` MUST be set to ``False``.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * show_image_direct_url
+# * location_strategy
+#
+# (boolean value)
+# This option is deprecated for removal since Newton.
+# Its value may be silently ignored in the future.
+# Reason: This option will be removed in the Pike release or later
+# because the same functionality can be achieved with greater
+# granularity by using policies. Please see the Newton release notes
+# for more information.
+#show_multiple_locations = false
+
+#
+# Maximum size of image a user can upload in bytes.
+#
+# An image upload greater than the size mentioned here would result
+# in an image creation failure. This configuration option defaults to
+# 1099511627776 bytes (1 TiB).
+#
+# NOTES:
+# * This value should only be increased after careful
+# consideration and must be set less than or equal to
+# 8 EiB (9223372036854775808).
+# * This value must be set with careful consideration of the
+# backend storage capacity. Setting this to a very low value
+# may result in a large number of image failures. And, setting
+# this to a very large value may result in faster consumption
+# of storage. Hence, this must be set according to the nature of
+# images created and storage capacity available.
+#
+# Possible values:
+# * Any positive number less than or equal to 9223372036854775808
+#
+# (integer value)
+# Minimum value: 1
+# Maximum value: 9223372036854775808
+#image_size_cap = 1099511627776
+
+#
+# Maximum amount of image storage per tenant.
+#
+# This enforces an upper limit on the cumulative storage consumed by
+# all images
+# of a tenant across all stores. This is a per-tenant limit.
+#
+# The default unit for this configuration option is Bytes. However,
+# storage
+# units can be specified using case-sensitive literals ``B``, ``KB``,
+# ``MB``,
+# ``GB`` and ``TB`` representing Bytes, KiloBytes, MegaBytes,
+# GigaBytes and
+# TeraBytes respectively. Note that there should not be any space
+# between the
+# value and unit. Value ``0`` signifies no quota enforcement. Negative
+# values
+# are invalid and result in errors.
+#
+# Possible values:
+# * A string that is a valid concatenation of a non-negative
+# integer
+# representing the storage value and an optional string literal
+# representing storage units as mentioned above.
+#
+# Related options:
+# * None
+#
+# (string value)
+#user_storage_quota = 0
+
+#
+# Deploy the v1 OpenStack Images API.
+#
+# When this option is set to ``True``, Glance service will respond to
+# requests on registered endpoints conforming to the v1 OpenStack
+# Images API.
+#
+# NOTES:
+# * If this option is enabled, then ``enable_v1_registry`` must
+# also be set to ``True`` to enable mandatory usage of Registry
+# service with v1 API.
+#
+# * If this option is disabled, then the ``enable_v1_registry``
+# option, which is enabled by default, is also recommended
+# to be disabled.
+#
+# * This option is separate from ``enable_v2_api``, both v1 and v2
+# OpenStack Images API can be deployed independent of each
+# other.
+#
+# * If deploying only the v2 Images API, this option, which is
+# enabled by default, should be disabled.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * enable_v1_registry
+# * enable_v2_api
+#
+# (boolean value)
+#enable_v1_api = true
+
+#
+# Deploy the v2 OpenStack Images API.
+#
+# When this option is set to ``True``, Glance service will respond
+# to requests on registered endpoints conforming to the v2 OpenStack
+# Images API.
+#
+# NOTES:
+# * If this option is disabled, then the ``enable_v2_registry``
+# option, which is enabled by default, is also recommended
+# to be disabled.
+#
+# * This option is separate from ``enable_v1_api``, both v1 and v2
+# OpenStack Images API can be deployed independent of each
+# other.
+#
+# * If deploying only the v1 Images API, this option, which is
+# enabled by default, should be disabled.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * enable_v2_registry
+# * enable_v1_api
+#
+# (boolean value)
+#enable_v2_api = true
+
+#
+# Deploy the v1 API Registry service.
+#
+# When this option is set to ``True``, the Registry service
+# will be enabled in Glance for v1 API requests.
+#
+# NOTES:
+# * Use of Registry is mandatory in v1 API, so this option must
+# be set to ``True`` if the ``enable_v1_api`` option is enabled.
+#
+# * If deploying only the v2 OpenStack Images API, this option,
+# which is enabled by default, should be disabled.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * enable_v1_api
+#
+# (boolean value)
+#enable_v1_registry = true
+
+# DEPRECATED:
+# Deploy the v2 API Registry service.
+#
+# When this option is set to ``True``, the Registry service
+# will be enabled in Glance for v2 API requests.
+#
+# NOTES:
+# * Use of Registry is optional in v2 API, so this option
+# must only be enabled if both ``enable_v2_api`` is set to
+# ``True`` and the ``data_api`` option is set to
+# ``glance.db.registry.api``.
+#
+# * If deploying only the v1 OpenStack Images API, this option,
+# which is enabled by default, should be disabled.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * enable_v2_api
+# * data_api
+#
+# (boolean value)
+# This option is deprecated for removal since Queens.
+# Its value may be silently ignored in the future.
+# Reason:
+# Glance registry service is deprecated for removal.
+#
+# More information can be found from the spec:
+# http://specs.openstack.org/openstack/glance-
+# specs/specs/queens/approved/glance/deprecate-registry.html
+#enable_v2_registry = true
+
+#
+# Host address of the pydev server.
+#
+# Provide a string value representing the hostname or IP of the
+# pydev server to use for debugging. The pydev server listens for
+# debug connections on this address, facilitating remote debugging
+# in Glance.
+#
+# Possible values:
+# * Valid hostname
+# * Valid IP address
+#
+# Related options:
+# * None
+#
+# (unknown value)
+#pydev_worker_debug_host = localhost
+
+#
+# Port number that the pydev server will listen on.
+#
+# Provide a port number to bind the pydev server to. The pydev
+# process accepts debug connections on this port and facilitates
+# remote debugging in Glance.
+#
+# Possible values:
+# * A valid port number
+#
+# Related options:
+# * None
+#
+# (port value)
+# Minimum value: 0
+# Maximum value: 65535
+#pydev_worker_debug_port = 5678
+
+#
+# AES key for encrypting store location metadata.
+#
+# Provide a string value representing the AES cipher to use for
+# encrypting Glance store metadata.
+#
+# NOTE: The AES key to use must be set to a random string of length
+# 16, 24 or 32 bytes.
+#
+# Possible values:
+# * String value representing a valid AES key
+#
+# Related options:
+# * None
+#
+# (string value)
+#metadata_encryption_key = <None>
+
+#
+# Digest algorithm to use for digital signature.
+#
+# Provide a string value representing the digest algorithm to
+# use for generating digital signatures. By default, ``sha256``
+# is used.
+#
+# To get a list of the available algorithms supported by the version
+# of OpenSSL on your platform, run the command:
+# ``openssl list-message-digest-algorithms``.
+# Examples are 'sha1', 'sha256', and 'sha512'.
+#
+# NOTE: ``digest_algorithm`` is not related to Glance's image signing
+# and verification. It is only used to sign the universally unique
+# identifier (UUID) as a part of the certificate file and key file
+# validation.
+#
+# Possible values:
+# * An OpenSSL message digest algorithm identifier
+#
+# Relation options:
+# * None
+#
+# (string value)
+#digest_algorithm = sha256
+
+#
+# The URL provides location where the temporary data will be stored
+#
+# This option is for Glance internal use only. Glance will save the
+# image data uploaded by the user to 'staging' endpoint during the
+# image import process.
+#
+# This option does not change the 'staging' API endpoint by any means.
+#
+# NOTE: It is discouraged to use same path as [task]/work_dir
+#
+# NOTE: 'file://<absolute-directory-path>' is the only option
+# api_image_import flow will support for now.
+#
+# NOTE: The staging path must be on shared filesystem available to all
+# Glance API nodes.
+#
+# Possible values:
+# * String starting with 'file://' followed by absolute FS path
+#
+# Related options:
+# * [task]/work_dir
+# * [DEFAULT]/enable_image_import (*deprecated*)
+#
+# (string value)
+#node_staging_uri = file:///tmp/staging/
+
+# DEPRECATED:
+# Enables the Image Import workflow introduced in Pike
+#
+# As '[DEFAULT]/node_staging_uri' is required for the Image
+# Import, it's disabled per default in Pike, enabled per
+# default in Queens and removed in Rocky. This allows Glance to
+# operate with previous version configs upon upgrade.
+#
+# Setting this option to False will disable the endpoints related
+# to Image Import Refactoring work.
+#
+# Related options:
+# * [DEFAULT]/node_staging_uri (boolean value)
+# This option is deprecated for removal since Pike.
+# Its value may be silently ignored in the future.
+# Reason:
+# This option is deprecated for removal in Rocky.
+#
+# It was introduced to make sure that the API is not enabled
+# before the '[DEFAULT]/node_staging_uri' is defined and is
+# long term redundant.
+#enable_image_import = true
+
+#
+# List of enabled Image Import Methods
+#
+# Both 'glance-direct' and 'web-download' are enabled by default.
+#
+# Related options:
+# * [DEFAULT]/node_staging_uri
+# * [DEFAULT]/enable_image_import (list value)
+#enabled_import_methods = glance-direct,web-download
+
+#
+# The amount of time, in seconds, to delay image scrubbing.
+#
+# When delayed delete is turned on, an image is put into
+# ``pending_delete``
+# state upon deletion until the scrubber deletes its image data.
+# Typically, soon
+# after the image is put into ``pending_delete`` state, it is
+# available for
+# scrubbing. However, scrubbing can be delayed until a later point
+# using this
+# configuration option. This option denotes the time period an image
+# spends in
+# ``pending_delete`` state before it is available for scrubbing.
+#
+# It is important to realize that this has storage implications. The
+# larger the
+# ``scrub_time``, the longer the time to reclaim backend storage from
+# deleted
+# images.
+#
+# Possible values:
+# * Any non-negative integer
+#
+# Related options:
+# * ``delayed_delete``
+#
+# (integer value)
+# Minimum value: 0
+#scrub_time = 0
+
+#
+# The size of thread pool to be used for scrubbing images.
+#
+# When there are a large number of images to scrub, it is beneficial
+# to scrub
+# images in parallel so that the scrub queue stays in control and the
+# backend
+# storage is reclaimed in a timely fashion. This configuration option
+# denotes
+# the maximum number of images to be scrubbed in parallel. The default
+# value is
+# one, which signifies serial scrubbing. Any value above one indicates
+# parallel
+# scrubbing.
+#
+# Possible values:
+# * Any non-zero positive integer
+#
+# Related options:
+# * ``delayed_delete``
+#
+# (integer value)
+# Minimum value: 1
+#scrub_pool_size = 1
+
+#
+# Turn on/off delayed delete.
+#
+# Typically when an image is deleted, the ``glance-api`` service puts
+# the image
+# into ``deleted`` state and deletes its data at the same time.
+# Delayed delete
+# is a feature in Glance that delays the actual deletion of image data
+# until a
+# later point in time (as determined by the configuration option
+# ``scrub_time``).
+# When delayed delete is turned on, the ``glance-api`` service puts
+# the image
+# into ``pending_delete`` state upon deletion and leaves the image
+# data in the
+# storage backend for the image scrubber to delete at a later time.
+# The image
+# scrubber will move the image into ``deleted`` state upon successful
+# deletion
+# of image data.
+#
+# NOTE: When delayed delete is turned on, image scrubber MUST be
+# running as a
+# periodic task to prevent the backend storage from filling up with
+# undesired
+# usage.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * ``scrub_time``
+# * ``wakeup_time``
+# * ``scrub_pool_size``
+#
+# (boolean value)
+#delayed_delete = false
+
+#
+# Time interval, in seconds, between scrubber runs in daemon mode.
+#
+# Scrubber can be run either as a cron job or daemon. When run as a
+# daemon, this
+# configuration time specifies the time period between two runs. When
+# the
+# scrubber wakes up, it fetches and scrubs all ``pending_delete``
+# images that
+# are available for scrubbing after taking ``scrub_time`` into
+# consideration.
+#
+# If the wakeup time is set to a large number, there may be a large
+# number of
+# images to be scrubbed for each run. Also, this impacts how quickly
+# the backend
+# storage is reclaimed.
+#
+# Possible values:
+# * Any non-negative integer
+#
+# Related options:
+# * ``daemon``
+# * ``delayed_delete``
+#
+# (integer value)
+# Minimum value: 0
+{%- if server.get('wakeup_time', 300) is defined %}
+wakeup_time = {{ server.get('wakeup_time', 300) }}
+{%- endif %}
+
+#
+# Run scrubber as a daemon.
+#
+# This boolean configuration option indicates whether scrubber should
+# run as a long-running process that wakes up at regular intervals to
+# scrub images. The wake up interval can be specified using the
+# configuration option ``wakeup_time``.
+#
+# If this configuration option is set to ``False``, which is the
+# default value, scrubber runs once to scrub images and exits. In this
+# case, if the operator wishes to implement continuous scrubbing of
+# images, scrubber needs to be scheduled as a cron job.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * ``wakeup_time``
+#
+# (boolean value)
+#daemon = false
+{%- if server.get('daemon', 'false') is defined %}
+daemon = {{ server.get('daemon', 'false') }}
+{%- endif %}
+
+{%- if server.logging is defined %}
+{%- set _data = server.logging %}
+{%- do _data.update({'log_file': '/var/log/glance/scrubber.log'}) %}
+{%- include "oslo_templates/files/queens/oslo/_log.conf" %}
+{%- endif %}
+
+[glance_store]
+
+#
+# From glance.store
+#
+
+#
+# List of enabled Glance stores.
+#
+# Register the storage backends to use for storing disk images
+# as a comma separated list. The default stores enabled for
+# storing disk images with Glance are ``file`` and ``http``.
+#
+# Possible values:
+# * A comma separated list that could include:
+# * file
+# * http
+# * swift
+# * rbd
+# * sheepdog
+# * cinder
+# * vmware
+#
+# Related Options:
+# * default_store
+#
+# (list value)
+#stores = file,http
+
+#
+# The default scheme to use for storing images.
+#
+# Provide a string value representing the default scheme to use for
+# storing images. If not set, Glance uses ``file`` as the default
+# scheme to store images with the ``file`` store.
+#
+# NOTE: The value given for this configuration option must be a valid
+# scheme for a store registered with the ``stores`` configuration
+# option.
+#
+# Possible values:
+# * file
+# * filesystem
+# * http
+# * https
+# * swift
+# * swift+http
+# * swift+https
+# * swift+config
+# * rbd
+# * sheepdog
+# * cinder
+# * vsphere
+#
+# Related Options:
+# * stores
+#
+# (string value)
+# Possible values:
+# file - <No description provided>
+# filesystem - <No description provided>
+# http - <No description provided>
+# https - <No description provided>
+# swift - <No description provided>
+# swift+http - <No description provided>
+# swift+https - <No description provided>
+# swift+config - <No description provided>
+# rbd - <No description provided>
+# sheepdog - <No description provided>
+# cinder - <No description provided>
+# vsphere - <No description provided>
+#default_store = file
+
+#
+# Minimum interval in seconds to execute updating dynamic storage
+# capabilities based on current backend status.
+#
+# Provide an integer value representing time in seconds to set the
+# minimum interval before an update of dynamic storage capabilities
+# for a storage backend can be attempted. Setting
+# ``store_capabilities_update_min_interval`` does not mean updates
+# occur periodically based on the set interval. Rather, the update
+# is performed at the elapse of this interval set, if an operation
+# of the store is triggered.
+#
+# By default, this option is set to zero and is disabled. Provide an
+# integer value greater than zero to enable this option.
+#
+# NOTE: For more information on store capabilities and their updates,
+# please visit: https://specs.openstack.org/openstack/glance-
+# specs/specs/kilo/store-capabilities.html
+#
+# For more information on setting up a particular store in your
+# deployment and help with the usage of this feature, please contact
+# the storage driver maintainers listed here:
+# http://docs.openstack.org/developer/glance_store/drivers/index.html
+#
+# Possible values:
+# * Zero
+# * Positive integer
+#
+# Related Options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+#store_capabilities_update_min_interval = 0
+
+#
+# Information to match when looking for cinder in the service catalog.
+#
+# When the ``cinder_endpoint_template`` is not set and any of
+# ``cinder_store_auth_address``, ``cinder_store_user_name``,
+# ``cinder_store_project_name``, ``cinder_store_password`` is not set,
+# cinder store uses this information to lookup cinder endpoint from
+# the service
+# catalog in the current context. ``cinder_os_region_name``, if set,
+# is taken
+# into consideration to fetch the appropriate endpoint.
+#
+# The service catalog can be listed by the ``openstack catalog list``
+# command.
+#
+# Possible values:
+# * A string of of the following form:
+# ``<service_type>:<service_name>:<interface>``
+# At least ``service_type`` and ``interface`` should be
+# specified.
+# ``service_name`` can be omitted.
+#
+# Related options:
+# * cinder_os_region_name
+# * cinder_endpoint_template
+# * cinder_store_auth_address
+# * cinder_store_user_name
+# * cinder_store_project_name
+# * cinder_store_password
+#
+# (string value)
+#cinder_catalog_info = volumev2::publicURL
+
+#
+# Override service catalog lookup with template for cinder endpoint.
+#
+# When this option is set, this value is used to generate cinder
+# endpoint,
+# instead of looking up from the service catalog.
+# This value is ignored if ``cinder_store_auth_address``,
+# ``cinder_store_user_name``, ``cinder_store_project_name``, and
+# ``cinder_store_password`` are specified.
+#
+# If this configuration option is set, ``cinder_catalog_info`` will be
+# ignored.
+#
+# Possible values:
+# * URL template string for cinder endpoint, where ``%%(tenant)s``
+# is
+# replaced with the current tenant (project) name.
+# For example:
+# ``http://cinder.openstack.example.org/v2/%%(tenant)s``
+#
+# Related options:
+# * cinder_store_auth_address
+# * cinder_store_user_name
+# * cinder_store_project_name
+# * cinder_store_password
+# * cinder_catalog_info
+#
+# (string value)
+#cinder_endpoint_template = <None>
+
+#
+# Region name to lookup cinder service from the service catalog.
+#
+# This is used only when ``cinder_catalog_info`` is used for
+# determining the
+# endpoint. If set, the lookup for cinder endpoint by this node is
+# filtered to
+# the specified region. It is useful when multiple regions are listed
+# in the
+# catalog. If this is not set, the endpoint is looked up from every
+# region.
+#
+# Possible values:
+# * A string that is a valid region name.
+#
+# Related options:
+# * cinder_catalog_info
+#
+# (string value)
+# Deprecated group/name - [glance_store]/os_region_name
+#cinder_os_region_name = <None>
+
+#
+# Location of a CA certificates file used for cinder client requests.
+#
+# The specified CA certificates file, if set, is used to verify cinder
+# connections via HTTPS endpoint. If the endpoint is HTTP, this value
+# is ignored.
+# ``cinder_api_insecure`` must be set to ``True`` to enable the
+# verification.
+#
+# Possible values:
+# * Path to a ca certificates file
+#
+# Related options:
+# * cinder_api_insecure
+#
+# (string value)
+#cinder_ca_certificates_file = <None>
+
+#
+# Number of cinderclient retries on failed http calls.
+#
+# When a call failed by any errors, cinderclient will retry the call
+# up to the
+# specified times after sleeping a few seconds.
+#
+# Possible values:
+# * A positive integer
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+#cinder_http_retries = 3
+
+#
+# Time period, in seconds, to wait for a cinder volume transition to
+# complete.
+#
+# When the cinder volume is created, deleted, or attached to the
+# glance node to
+# read/write the volume data, the volume's state is changed. For
+# example, the
+# newly created volume status changes from ``creating`` to
+# ``available`` after
+# the creation process is completed. This specifies the maximum time
+# to wait for
+# the status change. If a timeout occurs while waiting, or the status
+# is changed
+# to an unexpected value (e.g. `error``), the image creation fails.
+#
+# Possible values:
+# * A positive integer
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+#cinder_state_transition_timeout = 300
+
+#
+# Allow to perform insecure SSL requests to cinder.
+#
+# If this option is set to True, HTTPS endpoint connection is verified
+# using the
+# CA certificates file specified by ``cinder_ca_certificates_file``
+# option.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * cinder_ca_certificates_file
+#
+# (boolean value)
+#cinder_api_insecure = false
+
+#
+# The address where the cinder authentication service is listening.
+#
+# When all of ``cinder_store_auth_address``,
+# ``cinder_store_user_name``,
+# ``cinder_store_project_name``, and ``cinder_store_password`` options
+# are
+# specified, the specified values are always used for the
+# authentication.
+# This is useful to hide the image volumes from users by storing them
+# in a
+# project/tenant specific to the image service. It also enables users
+# to share
+# the image volume among other projects under the control of glance's
+# ACL.
+#
+# If either of these options are not set, the cinder endpoint is
+# looked up
+# from the service catalog, and current context's user and project are
+# used.
+#
+# Possible values:
+# * A valid authentication service address, for example:
+# ``http://openstack.example.org/identity/v2.0``
+#
+# Related options:
+# * cinder_store_user_name
+# * cinder_store_password
+# * cinder_store_project_name
+#
+# (string value)
+#cinder_store_auth_address = <None>
+
+#
+# User name to authenticate against cinder.
+#
+# This must be used with all the following related options. If any of
+# these are
+# not specified, the user of the current context is used.
+#
+# Possible values:
+# * A valid user name
+#
+# Related options:
+# * cinder_store_auth_address
+# * cinder_store_password
+# * cinder_store_project_name
+#
+# (string value)
+#cinder_store_user_name = <None>
+
+#
+# Password for the user authenticating against cinder.
+#
+# This must be used with all the following related options. If any of
+# these are
+# not specified, the user of the current context is used.
+#
+# Possible values:
+# * A valid password for the user specified by
+# ``cinder_store_user_name``
+#
+# Related options:
+# * cinder_store_auth_address
+# * cinder_store_user_name
+# * cinder_store_project_name
+#
+# (string value)
+#cinder_store_password = <None>
+
+#
+# Project name where the image volume is stored in cinder.
+#
+# If this configuration option is not set, the project in current
+# context is
+# used.
+#
+# This must be used with all the following related options. If any of
+# these are
+# not specified, the project of the current context is used.
+#
+# Possible values:
+# * A valid project name
+#
+# Related options:
+# * ``cinder_store_auth_address``
+# * ``cinder_store_user_name``
+# * ``cinder_store_password``
+#
+# (string value)
+#cinder_store_project_name = <None>
+
+#
+# Path to the rootwrap configuration file to use for running commands
+# as root.
+#
+# The cinder store requires root privileges to operate the image
+# volumes (for
+# connecting to iSCSI/FC volumes and reading/writing the volume data,
+# etc.).
+# The configuration file should allow the required commands by cinder
+# store and
+# os-brick library.
+#
+# Possible values:
+# * Path to the rootwrap config file
+#
+# Related options:
+# * None
+#
+# (string value)
+#rootwrap_config = /etc/glance/rootwrap.conf
+
+#
+# Volume type that will be used for volume creation in cinder.
+#
+# Some cinder backends can have several volume types to optimize
+# storage usage.
+# Adding this option allows an operator to choose a specific volume
+# type
+# in cinder that can be optimized for images.
+#
+# If this is not set, then the default volume type specified in the
+# cinder
+# configuration will be used for volume creation.
+#
+# Possible values:
+# * A valid volume type from cinder
+#
+# Related options:
+# * None
+#
+# (string value)
+#cinder_volume_type = <None>
+
+#
+# Directory to which the filesystem backend store writes images.
+#
+# Upon start up, Glance creates the directory if it doesn't already
+# exist and verifies write access to the user under which
+# ``glance-api`` runs. If the write access isn't available, a
+# ``BadStoreConfiguration`` exception is raised and the filesystem
+# store may not be available for adding new images.
+#
+# NOTE: This directory is used only when filesystem store is used as a
+# storage backend. Either ``filesystem_store_datadir`` or
+# ``filesystem_store_datadirs`` option must be specified in
+# ``glance-api.conf``. If both options are specified, a
+# ``BadStoreConfiguration`` will be raised and the filesystem store
+# may not be available for adding new images.
+#
+# Possible values:
+# * A valid path to a directory
+#
+# Related options:
+# * ``filesystem_store_datadirs``
+# * ``filesystem_store_file_perm``
+#
+# (string value)
+#filesystem_store_datadir = /var/lib/glance/images
+
+#
+# List of directories and their priorities to which the filesystem
+# backend store writes images.
+#
+# The filesystem store can be configured to store images in multiple
+# directories as opposed to using a single directory specified by the
+# ``filesystem_store_datadir`` configuration option. When using
+# multiple directories, each directory can be given an optional
+# priority to specify the preference order in which they should
+# be used. Priority is an integer that is concatenated to the
+# directory path with a colon where a higher value indicates higher
+# priority. When two directories have the same priority, the directory
+# with most free space is used. When no priority is specified, it
+# defaults to zero.
+#
+# More information on configuring filesystem store with multiple store
+# directories can be found at
+# http://docs.openstack.org/developer/glance/configuring.html
+#
+# NOTE: This directory is used only when filesystem store is used as a
+# storage backend. Either ``filesystem_store_datadir`` or
+# ``filesystem_store_datadirs`` option must be specified in
+# ``glance-api.conf``. If both options are specified, a
+# ``BadStoreConfiguration`` will be raised and the filesystem store
+# may not be available for adding new images.
+#
+# Possible values:
+# * List of strings of the following form:
+# * ``<a valid directory path>:<optional integer priority>``
+#
+# Related options:
+# * ``filesystem_store_datadir``
+# * ``filesystem_store_file_perm``
+#
+# (multi valued)
+#filesystem_store_datadirs =
+
+#
+# Filesystem store metadata file.
+#
+# The path to a file which contains the metadata to be returned with
+# any location associated with the filesystem store. The file must
+# contain a valid JSON object. The object should contain the keys
+# ``id`` and ``mountpoint``. The value for both keys should be a
+# string.
+#
+# Possible values:
+# * A valid path to the store metadata file
+#
+# Related options:
+# * None
+#
+# (string value)
+#filesystem_store_metadata_file = <None>
+{%- if server.filesystem_store_metadata_file is defined %}
+filesystem_store_metadata_file = {{ server.get('filesystem_store_metadata_file', '/etc/glance/filesystem_store_metadata.json') }}
+{%- endif %}
+
+#
+# File access permissions for the image files.
+#
+# Set the intended file access permissions for image data. This
+# provides
+# a way to enable other services, e.g. Nova, to consume images
+# directly
+# from the filesystem store. The users running the services that are
+# intended to be given access to could be made a member of the group
+# that owns the files created. Assigning a value less then or equal to
+# zero for this configuration option signifies that no changes be made
+# to the default permissions. This value will be decoded as an octal
+# digit.
+#
+# For more information, please refer the documentation at
+# http://docs.openstack.org/developer/glance/configuring.html
+#
+# Possible values:
+# * A valid file access permission
+# * Zero
+# * Any negative integer
+#
+# Related options:
+# * None
+#
+# (integer value)
+#filesystem_store_file_perm = 0
+
+#
+# Path to the CA bundle file.
+#
+# This configuration option enables the operator to use a custom
+# Certificate Authority file to verify the remote server certificate.
+# If
+# this option is set, the ``https_insecure`` option will be ignored
+# and
+# the CA file specified will be used to authenticate the server
+# certificate and establish a secure connection to the server.
+#
+# Possible values:
+# * A valid path to a CA file
+#
+# Related options:
+# * https_insecure
+#
+# (string value)
+#https_ca_certificates_file = <None>
+
+#
+# Set verification of the remote server certificate.
+#
+# This configuration option takes in a boolean value to determine
+# whether or not to verify the remote server certificate. If set to
+# True, the remote server certificate is not verified. If the option
+# is
+# set to False, then the default CA truststore is used for
+# verification.
+#
+# This option is ignored if ``https_ca_certificates_file`` is set.
+# The remote server certificate will then be verified using the file
+# specified using the ``https_ca_certificates_file`` option.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * https_ca_certificates_file
+#
+# (boolean value)
+#https_insecure = true
+
+#
+# The http/https proxy information to be used to connect to the remote
+# server.
+#
+# This configuration option specifies the http/https proxy information
+# that should be used to connect to the remote server. The proxy
+# information should be a key value pair of the scheme and proxy, for
+# example, http:10.0.0.1:3128. You can also specify proxies for
+# multiple
+# schemes by separating the key value pairs with a comma, for example,
+# http:10.0.0.1:3128, https:10.0.0.1:1080.
+#
+# Possible values:
+# * A comma separated list of scheme:proxy pairs as described
+# above
+#
+# Related options:
+# * None
+#
+# (dict value)
+#http_proxy_information =
+
+#
+# Size, in megabytes, to chunk RADOS images into.
+#
+# Provide an integer value representing the size in megabytes to chunk
+# Glance images into. The default chunk size is 8 megabytes. For
+# optimal
+# performance, the value should be a power of two.
+#
+# When Ceph's RBD object storage system is used as the storage backend
+# for storing Glance images, the images are chunked into objects of
+# the
+# size set using this option. These chunked objects are then stored
+# across the distributed block data store to use for Glance.
+#
+# Possible Values:
+# * Any positive integer value
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 1
+#rbd_store_chunk_size = 8
+
+#
+# RADOS pool in which images are stored.
+#
+# When RBD is used as the storage backend for storing Glance images,
+# the
+# images are stored by means of logical grouping of the objects
+# (chunks
+# of images) into a ``pool``. Each pool is defined with the number of
+# placement groups it can contain. The default pool that is used is
+# 'images'.
+#
+# More information on the RBD storage backend can be found here:
+# http://ceph.com/planet/how-data-is-stored-in-ceph-cluster/
+#
+# Possible Values:
+# * A valid pool name
+#
+# Related options:
+# * None
+#
+# (string value)
+#rbd_store_pool = images
+
+#
+# RADOS user to authenticate as.
+#
+# This configuration option takes in the RADOS user to authenticate
+# as.
+# This is only needed when RADOS authentication is enabled and is
+# applicable only if the user is using Cephx authentication. If the
+# value for this option is not set by the user or is set to None, a
+# default value will be chosen, which will be based on the client.
+# section in rbd_store_ceph_conf.
+#
+# Possible Values:
+# * A valid RADOS user
+#
+# Related options:
+# * rbd_store_ceph_conf
+#
+# (string value)
+#rbd_store_user = <None>
+
+#
+# Ceph configuration file path.
+#
+# This configuration option takes in the path to the Ceph
+# configuration
+# file to be used. If the value for this option is not set by the user
+# or is set to None, librados will locate the default configuration
+# file
+# which is located at /etc/ceph/ceph.conf. If using Cephx
+# authentication, this file should include a reference to the right
+# keyring in a client.<USER> section
+#
+# Possible Values:
+# * A valid path to a configuration file
+#
+# Related options:
+# * rbd_store_user
+#
+# (string value)
+#rbd_store_ceph_conf = /etc/ceph/ceph.conf
+
+#
+# Timeout value for connecting to Ceph cluster.
+#
+# This configuration option takes in the timeout value in seconds used
+# when connecting to the Ceph cluster i.e. it sets the time to wait
+# for
+# glance-api before closing the connection. This prevents glance-api
+# hangups during the connection to RBD. If the value for this option
+# is set to less than or equal to 0, no timeout is set and the default
+# librados value is used.
+#
+# Possible Values:
+# * Any integer value
+#
+# Related options:
+# * None
+#
+# (integer value)
+#rados_connect_timeout = 0
+
+#
+# Chunk size for images to be stored in Sheepdog data store.
+#
+# Provide an integer value representing the size in mebibyte
+# (1048576 bytes) to chunk Glance images into. The default
+# chunk size is 64 mebibytes.
+#
+# When using Sheepdog distributed storage system, the images are
+# chunked into objects of this size and then stored across the
+# distributed data store to use for Glance.
+#
+# Chunk sizes, if a power of two, help avoid fragmentation and
+# enable improved performance.
+#
+# Possible values:
+# * Positive integer value representing size in mebibytes.
+#
+# Related Options:
+# * None
+#
+# (integer value)
+# Minimum value: 1
+#sheepdog_store_chunk_size = 64
+
+#
+# Port number on which the sheep daemon will listen.
+#
+# Provide an integer value representing a valid port number on
+# which you want the Sheepdog daemon to listen on. The default
+# port is 7000.
+#
+# The Sheepdog daemon, also called 'sheep', manages the storage
+# in the distributed cluster by writing objects across the storage
+# network. It identifies and acts on the messages it receives on
+# the port number set using ``sheepdog_store_port`` option to store
+# chunks of Glance images.
+#
+# Possible values:
+# * A valid port number (0 to 65535)
+#
+# Related Options:
+# * sheepdog_store_address
+#
+# (port value)
+# Minimum value: 0
+# Maximum value: 65535
+#sheepdog_store_port = 7000
+
+#
+# Address to bind the Sheepdog daemon to.
+#
+# Provide a string value representing the address to bind the
+# Sheepdog daemon to. The default address set for the 'sheep'
+# is 127.0.0.1.
+#
+# The Sheepdog daemon, also called 'sheep', manages the storage
+# in the distributed cluster by writing objects across the storage
+# network. It identifies and acts on the messages directed to the
+# address set using ``sheepdog_store_address`` option to store
+# chunks of Glance images.
+#
+# Possible values:
+# * A valid IPv4 address
+# * A valid IPv6 address
+# * A valid hostname
+#
+# Related Options:
+# * sheepdog_store_port
+#
+# (unknown value)
+#sheepdog_store_address = 127.0.0.1
+
+#
+# Set verification of the server certificate.
+#
+# This boolean determines whether or not to verify the server
+# certificate. If this option is set to True, swiftclient won't check
+# for a valid SSL certificate when authenticating. If the option is
+# set
+# to False, then the default CA truststore is used for verification.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * swift_store_cacert
+#
+# (boolean value)
+#swift_store_auth_insecure = false
+
+#
+# Path to the CA bundle file.
+#
+# This configuration option enables the operator to specify the path
+# to
+# a custom Certificate Authority file for SSL verification when
+# connecting to Swift.
+#
+# Possible values:
+# * A valid path to a CA file
+#
+# Related options:
+# * swift_store_auth_insecure
+#
+# (string value)
+#swift_store_cacert = /etc/ssl/certs/ca-certificates.crt
+
+#
+# The region of Swift endpoint to use by Glance.
+#
+# Provide a string value representing a Swift region where Glance
+# can connect to for image storage. By default, there is no region
+# set.
+#
+# When Glance uses Swift as the storage backend to store images
+# for a specific tenant that has multiple endpoints, setting of a
+# Swift region with ``swift_store_region`` allows Glance to connect
+# to Swift in the specified region as opposed to a single region
+# connectivity.
+#
+# This option can be configured for both single-tenant and
+# multi-tenant storage.
+#
+# NOTE: Setting the region with ``swift_store_region`` is
+# tenant-specific and is necessary ``only if`` the tenant has
+# multiple endpoints across different regions.
+#
+# Possible values:
+# * A string value representing a valid Swift region.
+#
+# Related Options:
+# * None
+#
+# (string value)
+#swift_store_region = RegionTwo
+
+#
+# The URL endpoint to use for Swift backend storage.
+#
+# Provide a string value representing the URL endpoint to use for
+# storing Glance images in Swift store. By default, an endpoint
+# is not set and the storage URL returned by ``auth`` is used.
+# Setting an endpoint with ``swift_store_endpoint`` overrides the
+# storage URL and is used for Glance image storage.
+#
+# NOTE: The URL should include the path up to, but excluding the
+# container. The location of an object is obtained by appending
+# the container and object to the configured URL.
+#
+# Possible values:
+# * String value representing a valid URL path up to a Swift
+# container
+#
+# Related Options:
+# * None
+#
+# (string value)
+#swift_store_endpoint = https://swift.openstack.example.org/v1/path_not_including_container_name
+
+#
+# Endpoint Type of Swift service.
+#
+# This string value indicates the endpoint type to use to fetch the
+# Swift endpoint. The endpoint type determines the actions the user
+# will
+# be allowed to perform, for instance, reading and writing to the
+# Store.
+# This setting is only used if swift_store_auth_version is greater
+# than
+# 1.
+#
+# Possible values:
+# * publicURL
+# * adminURL
+# * internalURL
+#
+# Related options:
+# * swift_store_endpoint
+#
+# (string value)
+# Possible values:
+# publicURL - <No description provided>
+# adminURL - <No description provided>
+# internalURL - <No description provided>
+#swift_store_endpoint_type = publicURL
+
+#
+# Type of Swift service to use.
+#
+# Provide a string value representing the service type to use for
+# storing images while using Swift backend storage. The default
+# service type is set to ``object-store``.
+#
+# NOTE: If ``swift_store_auth_version`` is set to 2, the value for
+# this configuration option needs to be ``object-store``. If using
+# a higher version of Keystone or a different auth scheme, this
+# option may be modified.
+#
+# Possible values:
+# * A string representing a valid service type for Swift storage.
+#
+# Related Options:
+# * None
+#
+# (string value)
+#swift_store_service_type = object-store
+
+#
+# Name of single container to store images/name prefix for multiple
+# containers
+#
+# When a single container is being used to store images, this
+# configuration
+# option indicates the container within the Glance account to be used
+# for
+# storing all images. When multiple containers are used to store
+# images, this
+# will be the name prefix for all containers. Usage of single/multiple
+# containers can be controlled using the configuration option
+# ``swift_store_multiple_containers_seed``.
+#
+# When using multiple containers, the containers will be named after
+# the value
+# set for this configuration option with the first N chars of the
+# image UUID
+# as the suffix delimited by an underscore (where N is specified by
+# ``swift_store_multiple_containers_seed``).
+#
+# Example: if the seed is set to 3 and swift_store_container =
+# ``glance``, then
+# an image with UUID ``fdae39a1-bac5-4238-aba4-69bcc726e848`` would be
+# placed in
+# the container ``glance_fda``. All dashes in the UUID are included
+# when
+# creating the container name but do not count toward the character
+# limit, so
+# when N=10 the container name would be ``glance_fdae39a1-ba.``
+#
+# Possible values:
+# * If using single container, this configuration option can be
+# any string
+# that is a valid swift container name in Glance's Swift account
+# * If using multiple containers, this configuration option can be
+# any
+# string as long as it satisfies the container naming rules
+# enforced by
+# Swift. The value of ``swift_store_multiple_containers_seed``
+# should be
+# taken into account as well.
+#
+# Related options:
+# * ``swift_store_multiple_containers_seed``
+# * ``swift_store_multi_tenant``
+# * ``swift_store_create_container_on_put``
+#
+# (string value)
+#swift_store_container = glance
+
+#
+# The size threshold, in MB, after which Glance will start segmenting
+# image data.
+#
+# Swift has an upper limit on the size of a single uploaded object. By
+# default,
+# this is 5GB. To upload objects bigger than this limit, objects are
+# segmented
+# into multiple smaller objects that are tied together with a manifest
+# file.
+# For more detail, refer to
+# http://docs.openstack.org/developer/swift/overview_large_objects.html
+#
+# This configuration option specifies the size threshold over which
+# the Swift
+# driver will start segmenting image data into multiple smaller files.
+# Currently, the Swift driver only supports creating Dynamic Large
+# Objects.
+#
+# NOTE: This should be set by taking into account the large object
+# limit
+# enforced by the Swift cluster in consideration.
+#
+# Possible values:
+# * A positive integer that is less than or equal to the large
+# object limit
+# enforced by the Swift cluster in consideration.
+#
+# Related options:
+# * ``swift_store_large_object_chunk_size``
+#
+# (integer value)
+# Minimum value: 1
+#swift_store_large_object_size = 5120
+
+#
+# The maximum size, in MB, of the segments when image data is
+# segmented.
+#
+# When image data is segmented to upload images that are larger than
+# the limit
+# enforced by the Swift cluster, image data is broken into segments
+# that are no
+# bigger than the size specified by this configuration option.
+# Refer to ``swift_store_large_object_size`` for more detail.
+#
+# For example: if ``swift_store_large_object_size`` is 5GB and
+# ``swift_store_large_object_chunk_size`` is 1GB, an image of size
+# 6.2GB will be
+# segmented into 7 segments where the first six segments will be 1GB
+# in size and
+# the seventh segment will be 0.2GB.
+#
+# Possible values:
+# * A positive integer that is less than or equal to the large
+# object limit
+# enforced by Swift cluster in consideration.
+#
+# Related options:
+# * ``swift_store_large_object_size``
+#
+# (integer value)
+# Minimum value: 1
+#swift_store_large_object_chunk_size = 200
+
+#
+# Create container, if it doesn't already exist, when uploading image.
+#
+# At the time of uploading an image, if the corresponding container
+# doesn't
+# exist, it will be created provided this configuration option is set
+# to True.
+# By default, it won't be created. This behavior is applicable for
+# both single
+# and multiple containers mode.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * None
+#
+# (boolean value)
+#swift_store_create_container_on_put = false
+
+#
+# Store images in tenant's Swift account.
+#
+# This enables multi-tenant storage mode which causes Glance images to
+# be stored
+# in tenant specific Swift accounts. If this is disabled, Glance
+# stores all
+# images in its own account. More details multi-tenant store can be
+# found at
+# https://wiki.openstack.org/wiki/GlanceSwiftTenantSpecificStorage
+#
+# NOTE: If using multi-tenant swift store, please make sure
+# that you do not set a swift configuration file with the
+# 'swift_store_config_file' option.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * swift_store_config_file
+#
+# (boolean value)
+#swift_store_multi_tenant = false
+
+#
+# Seed indicating the number of containers to use for storing images.
+#
+# When using a single-tenant store, images can be stored in one or
+# more than one
+# containers. When set to 0, all images will be stored in one single
+# container.
+# When set to an integer value between 1 and 32, multiple containers
+# will be
+# used to store images. This configuration option will determine how
+# many
+# containers are created. The total number of containers that will be
+# used is
+# equal to 16^N, so if this config option is set to 2, then 16^2=256
+# containers
+# will be used to store images.
+#
+# Please refer to ``swift_store_container`` for more detail on the
+# naming
+# convention. More detail about using multiple containers can be found
+# at
+# https://specs.openstack.org/openstack/glance-specs/specs/kilo/swift-
+# store-multiple-containers.html
+#
+# NOTE: This is used only when swift_store_multi_tenant is disabled.
+#
+# Possible values:
+# * A non-negative integer less than or equal to 32
+#
+# Related options:
+# * ``swift_store_container``
+# * ``swift_store_multi_tenant``
+# * ``swift_store_create_container_on_put``
+#
+# (integer value)
+# Minimum value: 0
+# Maximum value: 32
+#swift_store_multiple_containers_seed = 0
+
+#
+# List of tenants that will be granted admin access.
+#
+# This is a list of tenants that will be granted read/write access on
+# all Swift containers created by Glance in multi-tenant mode. The
+# default value is an empty list.
+#
+# Possible values:
+# * A comma separated list of strings representing UUIDs of
+# Keystone
+# projects/tenants
+#
+# Related options:
+# * None
+#
+# (list value)
+#swift_store_admin_tenants =
+
+#
+# SSL layer compression for HTTPS Swift requests.
+#
+# Provide a boolean value to determine whether or not to compress
+# HTTPS Swift requests for images at the SSL layer. By default,
+# compression is enabled.
+#
+# When using Swift as the backend store for Glance image storage,
+# SSL layer compression of HTTPS Swift requests can be set using
+# this option. If set to False, SSL layer compression of HTTPS
+# Swift requests is disabled. Disabling this option may improve
+# performance for images which are already in a compressed format,
+# for example, qcow2.
+#
+# Possible values:
+# * True
+# * False
+#
+# Related Options:
+# * None
+#
+# (boolean value)
+#swift_store_ssl_compression = true
+
+#
+# The number of times a Swift download will be retried before the
+# request fails.
+#
+# Provide an integer value representing the number of times an image
+# download must be retried before erroring out. The default value is
+# zero (no retry on a failed image download). When set to a positive
+# integer value, ``swift_store_retry_get_count`` ensures that the
+# download is attempted this many more times upon a download failure
+# before sending an error message.
+#
+# Possible values:
+# * Zero
+# * Positive integer value
+#
+# Related Options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+#swift_store_retry_get_count = 0
+
+#
+# Time in seconds defining the size of the window in which a new
+# token may be requested before the current token is due to expire.
+#
+# Typically, the Swift storage driver fetches a new token upon the
+# expiration of the current token to ensure continued access to
+# Swift. However, some Swift transactions (like uploading image
+# segments) may not recover well if the token expires on the fly.
+#
+# Hence, by fetching a new token before the current token expiration,
+# we make sure that the token does not expire or is close to expiry
+# before a transaction is attempted. By default, the Swift storage
+# driver requests for a new token 60 seconds or less before the
+# current token expiration.
+#
+# Possible values:
+# * Zero
+# * Positive integer value
+#
+# Related Options:
+# * None
+#
+# (integer value)
+# Minimum value: 0
+#swift_store_expire_soon_interval = 60
+
+#
+# Use trusts for multi-tenant Swift store.
+#
+# This option instructs the Swift store to create a trust for each
+# add/get request when the multi-tenant store is in use. Using trusts
+# allows the Swift store to avoid problems that can be caused by an
+# authentication token expiring during the upload or download of data.
+#
+# By default, ``swift_store_use_trusts`` is set to ``True``(use of
+# trusts is enabled). If set to ``False``, a user token is used for
+# the Swift connection instead, eliminating the overhead of trust
+# creation.
+#
+# NOTE: This option is considered only when
+# ``swift_store_multi_tenant`` is set to ``True``
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * swift_store_multi_tenant
+#
+# (boolean value)
+#swift_store_use_trusts = true
+
+#
+# Buffer image segments before upload to Swift.
+#
+# Provide a boolean value to indicate whether or not Glance should
+# buffer image data to disk while uploading to swift. This enables
+# Glance to resume uploads on error.
+#
+# NOTES:
+# When enabling this option, one should take great care as this
+# increases disk usage on the API node. Be aware that depending
+# upon how the file system is configured, the disk space used
+# for buffering may decrease the actual disk space available for
+# the glance image cache. Disk utilization will cap according to
+# the following equation:
+# (``swift_store_large_object_chunk_size`` * ``workers`` * 1000)
+#
+# Possible values:
+# * True
+# * False
+#
+# Related options:
+# * swift_upload_buffer_dir
+#
+# (boolean value)
+#swift_buffer_on_upload = false
+
+#
+# Reference to default Swift account/backing store parameters.
+#
+# Provide a string value representing a reference to the default set
+# of parameters required for using swift account/backing store for
+# image storage. The default reference value for this configuration
+# option is 'ref1'. This configuration option dereferences the
+# parameters and facilitates image storage in Swift storage backend
+# every time a new image is added.
+#
+# Possible values:
+# * A valid string value
+#
+# Related options:
+# * None
+#
+# (string value)
+#default_swift_reference = ref1
+
+# DEPRECATED: Version of the authentication service to use. Valid
+# versions are 2 and 3 for keystone and 1 (deprecated) for swauth and
+# rackspace. (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason:
+# The option 'auth_version' in the Swift back-end configuration file
+# is
+# used instead.
+#swift_store_auth_version = 2
+
+# DEPRECATED: The address where the Swift authentication service is
+# listening. (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason:
+# The option 'auth_address' in the Swift back-end configuration file
+# is
+# used instead.
+#swift_store_auth_address = <None>
+
+# DEPRECATED: The user to authenticate against the Swift
+# authentication service. (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason:
+# The option 'user' in the Swift back-end configuration file is set
+# instead.
+#swift_store_user = <None>
+
+# DEPRECATED: Auth key for the user authenticating against the Swift
+# authentication service. (string value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+# Reason:
+# The option 'key' in the Swift back-end configuration file is used
+# to set the authentication key instead.
+#swift_store_key = <None>
+
+#
+# Absolute path to the file containing the swift account(s)
+# configurations.
+#
+# Include a string value representing the path to a configuration
+# file that has references for each of the configured Swift
+# account(s)/backing stores. By default, no file path is specified
+# and customized Swift referencing is disabled. Configuring this
+# option is highly recommended while using Swift storage backend for
+# image storage as it avoids storage of credentials in the database.
+#
+# NOTE: Please do not configure this option if you have set
+# ``swift_store_multi_tenant`` to ``True``.
+#
+# Possible values:
+# * String value representing an absolute path on the glance-api
+# node
+#
+# Related options:
+# * swift_store_multi_tenant
+#
+# (string value)
+#swift_store_config_file = <None>
+
+#
+# Directory to buffer image segments before upload to Swift.
+#
+# Provide a string value representing the absolute path to the
+# directory on the glance node where image segments will be
+# buffered briefly before they are uploaded to swift.
+#
+# NOTES:
+# * This is required only when the configuration option
+# ``swift_buffer_on_upload`` is set to True.
+# * This directory should be provisioned keeping in mind the
+# ``swift_store_large_object_chunk_size`` and the maximum
+# number of images that could be uploaded simultaneously by
+# a given glance node.
+#
+# Possible values:
+# * String value representing an absolute directory path
+#
+# Related options:
+# * swift_buffer_on_upload
+# * swift_store_large_object_chunk_size
+#
+# (string value)
+#swift_upload_buffer_dir = <None>
+
+#
+# Address of the ESX/ESXi or vCenter Server target system.
+#
+# This configuration option sets the address of the ESX/ESXi or
+# vCenter
+# Server target system. This option is required when using the VMware
+# storage backend. The address can contain an IP address (127.0.0.1)
+# or
+# a DNS name (www.my-domain.com).
+#
+# Possible Values:
+# * A valid IPv4 or IPv6 address
+# * A valid DNS name
+#
+# Related options:
+# * vmware_server_username
+# * vmware_server_password
+#
+# (unknown value)
+#vmware_server_host = 127.0.0.1
+
+#
+# Server username.
+#
+# This configuration option takes the username for authenticating with
+# the VMware ESX/ESXi or vCenter Server. This option is required when
+# using the VMware storage backend.
+#
+# Possible Values:
+# * Any string that is the username for a user with appropriate
+# privileges
+#
+# Related options:
+# * vmware_server_host
+# * vmware_server_password
+#
+# (string value)
+#vmware_server_username = root
+
+#
+# Server password.
+#
+# This configuration option takes the password for authenticating with
+# the VMware ESX/ESXi or vCenter Server. This option is required when
+# using the VMware storage backend.
+#
+# Possible Values:
+# * Any string that is a password corresponding to the username
+# specified using the "vmware_server_username" option
+#
+# Related options:
+# * vmware_server_host
+# * vmware_server_username
+#
+# (string value)
+#vmware_server_password = vmware
+
+#
+# The number of VMware API retries.
+#
+# This configuration option specifies the number of times the VMware
+# ESX/VC server API must be retried upon connection related issues or
+# server API call overload. It is not possible to specify 'retry
+# forever'.
+#
+# Possible Values:
+# * Any positive integer value
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 1
+#vmware_api_retry_count = 10
+
+#
+# Interval in seconds used for polling remote tasks invoked on VMware
+# ESX/VC server.
+#
+# This configuration option takes in the sleep time in seconds for
+# polling an
+# on-going async task as part of the VMWare ESX/VC server API call.
+#
+# Possible Values:
+# * Any positive integer value
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 1
+#vmware_task_poll_interval = 5
+
+#
+# The directory where the glance images will be stored in the
+# datastore.
+#
+# This configuration option specifies the path to the directory where
+# the
+# glance images will be stored in the VMware datastore. If this option
+# is not set, the default directory where the glance images are
+# stored
+# is openstack_glance.
+#
+# Possible Values:
+# * Any string that is a valid path to a directory
+#
+# Related options:
+# * None
+#
+# (string value)
+#vmware_store_image_dir = /openstack_glance
+
+#
+# Set verification of the ESX/vCenter server certificate.
+#
+# This configuration option takes a boolean value to determine
+# whether or not to verify the ESX/vCenter server certificate. If this
+# option is set to True, the ESX/vCenter server certificate is not
+# verified. If this option is set to False, then the default CA
+# truststore is used for verification.
+#
+# This option is ignored if the "vmware_ca_file" option is set. In
+# that
+# case, the ESX/vCenter server certificate will then be verified using
+# the file specified using the "vmware_ca_file" option .
+#
+# Possible Values:
+# * True
+# * False
+#
+# Related options:
+# * vmware_ca_file
+#
+# (boolean value)
+# Deprecated group/name - [glance_store]/vmware_api_insecure
+#vmware_insecure = false
+
+#
+# Absolute path to the CA bundle file.
+#
+# This configuration option enables the operator to use a custom
+# Cerificate Authority File to verify the ESX/vCenter certificate.
+#
+# If this option is set, the "vmware_insecure" option will be ignored
+# and the CA file specified will be used to authenticate the
+# ESX/vCenter
+# server certificate and establish a secure connection to the server.
+#
+# Possible Values:
+# * Any string that is a valid absolute path to a CA file
+#
+# Related options:
+# * vmware_insecure
+#
+# (string value)
+#vmware_ca_file = /etc/ssl/certs/ca-certificates.crt
+
+#
+# The datastores where the image can be stored.
+#
+# This configuration option specifies the datastores where the image
+# can
+# be stored in the VMWare store backend. This option may be specified
+# multiple times for specifying multiple datastores. The datastore
+# name
+# should be specified after its datacenter path, separated by ":". An
+# optional weight may be given after the datastore name, separated
+# again
+# by ":" to specify the priority. Thus, the required format becomes
+# <datacenter_path>:<datastore_name>:<optional_weight>.
+#
+# When adding an image, the datastore with highest weight will be
+# selected, unless there is not enough free space available in cases
+# where the image size is already known. If no weight is given, it is
+# assumed to be zero and the directory will be considered for
+# selection
+# last. If multiple datastores have the same weight, then the one with
+# the most free space available is selected.
+#
+# Possible Values:
+# * Any string of the format:
+# <datacenter_path>:<datastore_name>:<optional_weight>
+#
+# Related options:
+# * None
+#
+# (multi valued)
+#vmware_datastores =
+
+[oslo_concurrency]
+{%- if server.concurrency is defined %}
+{%- set _data = server.oslo_policy %}
+{%- include "oslo_templates/files/queens/oslo/_concurrency.conf" %}
+{%- endif %}
+
+[database]
+{%- set _data = server.database %}
+{%- if _data.ssl is defined and 'cacert_file' not in _data.get('ssl', {}).keys() %}{% do _data['ssl'].update({'cacert_file': server.cacert_file}) %}{% endif %}
+{%- include "oslo_templates/files/queens/oslo/_database.conf" %}
+
+[oslo_policy]
+{%- if server.oslo_policy is defined %}
+{%- set _data = server.oslo_policy %}
+{%- include "oslo_templates/files/queens/oslo/_policy.conf" %}
+{%- endif %}
diff --git a/glance/files/queens/glance-scrubber.conf.RedHat b/glance/files/queens/glance-scrubber.conf.RedHat
new file mode 120000
index 0000000..2fc1db1
--- /dev/null
+++ b/glance/files/queens/glance-scrubber.conf.RedHat
@@ -0,0 +1 @@
+glance-scrubber.conf.Debian
\ No newline at end of file
diff --git a/glance/files/queens/stores/_vmware.conf b/glance/files/queens/stores/_vmware.conf
new file mode 100644
index 0000000..89c931a
--- /dev/null
+++ b/glance/files/queens/stores/_vmware.conf
@@ -0,0 +1,211 @@
+
+#
+# Address of the ESX/ESXi or vCenter Server target system.
+#
+# This configuration option sets the address of the ESX/ESXi or vCenter
+# Server target system. This option is required when using the VMware
+# storage backend. The address can contain an IP address (127.0.0.1) or
+# a DNS name (www.my-domain.com).
+#
+# Possible Values:
+# * A valid IPv4 or IPv6 address
+# * A valid DNS name
+#
+# Related options:
+# * vmware_server_username
+# * vmware_server_password
+#
+# (unknown value)
+#vmware_server_host = 127.0.0.1
+{%- if _data.server_host is defined %}
+vmware_server_host = {{ _data.server_host }}
+{%- endif %}
+
+#
+# Server username.
+#
+# This configuration option takes the username for authenticating with
+# the VMware ESX/ESXi or vCenter Server. This option is required when
+# using the VMware storage backend.
+#
+# Possible Values:
+# * Any string that is the username for a user with appropriate
+# privileges
+#
+# Related options:
+# * vmware_server_host
+# * vmware_server_password
+#
+# (string value)
+#vmware_server_username = root
+vmware_server_username = {{ _data.server_username }}
+
+#
+# Server password.
+#
+# This configuration option takes the password for authenticating with
+# the VMware ESX/ESXi or vCenter Server. This option is required when
+# using the VMware storage backend.
+#
+# Possible Values:
+# * Any string that is a password corresponding to the username
+# specified using the "vmware_server_username" option
+#
+# Related options:
+# * vmware_server_host
+# * vmware_server_username
+#
+# (string value)
+#vmware_server_password = vmware
+vmware_server_password = {{ _data.server_password }}
+
+#
+# The number of VMware API retries.
+#
+# This configuration option specifies the number of times the VMware
+# ESX/VC server API must be retried upon connection related issues or
+# server API call overload. It is not possible to specify 'retry
+# forever'.
+#
+# Possible Values:
+# * Any positive integer value
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 1
+#vmware_api_retry_count = 10
+{%- if _data.api_retry_count is defined %}
+vmware_api_retry_count = {{ _data.api_retry_count }}
+{%- endif %}
+
+#
+# Interval in seconds used for polling remote tasks invoked on VMware
+# ESX/VC server.
+#
+# This configuration option takes in the sleep time in seconds for polling an
+# on-going async task as part of the VMWare ESX/VC server API call.
+#
+# Possible Values:
+# * Any positive integer value
+#
+# Related options:
+# * None
+#
+# (integer value)
+# Minimum value: 1
+#vmware_task_poll_interval = 5
+{%- if _data.task_poll_interval is defined %}
+vmware_task_poll_interval = {{ _data.task_poll_interval }}
+{%- endif %}
+
+#
+# The directory where the glance images will be stored in the datastore.
+#
+# This configuration option specifies the path to the directory where the
+# glance images will be stored in the VMware datastore. If this option
+# is not set, the default directory where the glance images are stored
+# is openstack_glance.
+#
+# Possible Values:
+# * Any string that is a valid path to a directory
+#
+# Related options:
+# * None
+#
+# (string value)
+#vmware_store_image_dir = /openstack_glance
+{%- if _data.store_image_dir is defined %}
+vmware_store_image_dir = {{ _data.store_image_dir }}
+{%- endif %}
+
+#
+# Set verification of the ESX/vCenter server certificate.
+#
+# This configuration option takes a boolean value to determine
+# whether or not to verify the ESX/vCenter server certificate. If this
+# option is set to True, the ESX/vCenter server certificate is not
+# verified. If this option is set to False, then the default CA
+# truststore is used for verification.
+#
+# This option is ignored if the "vmware_ca_file" option is set. In that
+# case, the ESX/vCenter server certificate will then be verified using
+# the file specified using the "vmware_ca_file" option .
+#
+# Possible Values:
+# * True
+# * False
+#
+# Related options:
+# * vmware_ca_file
+#
+# (boolean value)
+# Deprecated group/name - [glance_store]/vmware_api_insecure
+#vmware_insecure = false
+{%- if _data.insecure is defined %}
+vmware_insecure = {{ _data.insecure }}
+{%- endif %}
+
+#
+# Absolute path to the CA bundle file.
+#
+# This configuration option enables the operator to use a custom
+# Cerificate Authority File to verify the ESX/vCenter certificate.
+#
+# If this option is set, the "vmware_insecure" option will be ignored
+# and the CA file specified will be used to authenticate the ESX/vCenter
+# server certificate and establish a secure connection to the server.
+#
+# Possible Values:
+# * Any string that is a valid absolute path to a CA file
+#
+# Related options:
+# * vmware_insecure
+#
+# (string value)
+#vmware_ca_file = /etc/ssl/certs/ca-certificates.crt
+{%- if _data.cacert_file is defined %}
+vmware_ca_file = {{ _data.cacert_file }}
+{%- endif %}
+
+#
+# The datastores where the image can be stored.
+#
+# This configuration option specifies the datastores where the image can
+# be stored in the VMWare store backend. This option may be specified
+# multiple times for specifying multiple datastores. The datastore name
+# should be specified after its datacenter path, separated by ":". An
+# optional weight may be given after the datastore name, separated again
+# by ":" to specify the priority. Thus, the required format becomes
+# <datacenter_path>:<datastore_name>:<optional_weight>.
+#
+# When adding an image, the datastore with highest weight will be
+# selected, unless there is not enough free space available in cases
+# where the image size is already known. If no weight is given, it is
+# assumed to be zero and the directory will be considered for selection
+# last. If multiple datastores have the same weight, then the one with
+# the most free space available is selected.
+#
+# Possible Values:
+# * Any string of the format:
+# <datacenter_path>:<datastore_name>:<optional_weight>
+#
+# Related options:
+# * None
+#
+# (multi valued)
+#vmware_datastores =
+{%- if _data.datastores is defined %}
+{%- for dname,ddata in _data.datastores.iteritems() %}
+{%- set vmware_datastores = [] %}
+{%- if ddata.get('enabled', False) %}
+{%- do vmware_datastores.append(ddata.path) %}
+{%- do vmware_datastores.append(ddata.get('name', dname)) %}
+{%- if ddata.weight is defined %}
+{%- do vmware_datastores.append(ddata.weight|string) %}
+{%- endif %}
+{%- endif %}
+vmware_datastores = {{ ':'.join(vmware_datastores) }}
+{%- endfor %}
+{%- endif %}
diff --git a/glance/map.jinja b/glance/map.jinja
index fc912f3..400d035 100644
--- a/glance/map.jinja
+++ b/glance/map.jinja
@@ -17,7 +17,14 @@
},
'glance_uid': 302,
'glance_gid': 302,
+ 'amqp': {
+ 'default_notification_exchange': 'glance'
+ },
+ 'oslo_policy': {
+ 'policy_file': '/etc/glance/policy.json'
+ },
'logging': {
+ 'app_name': 'glance',
'log_appender': false,
'log_handlers': {
'watchedfile': {
@@ -36,7 +43,14 @@
},
'glance_uid': 302,
'glance_gid': 302,
+ 'amqp': {
+ 'default_notification_exchange': 'glance'
+ },
+ 'oslo_policy': {
+ 'policy_file': '/etc/glance/policy.json'
+ },
'logging': {
+ 'app_name': 'glance',
'log_appender': false,
'log_handlers': {
'watchedfile': {
@@ -49,15 +63,16 @@
{% set client = salt['grains.filter_by']({
'Debian': {
- 'pkgs': ['python-glanceclient']
+ 'pkgs': ['python-glanceclient', 'python-keystoneclient']
},
'RedHat': {
- 'pkgs': ['python-glanceclient']
+ 'pkgs': ['python-glanceclient', 'python-keystoneclient']
},
}, merge=pillar.glance.get('client', {})) %}
{% set monitoring = salt['grains.filter_by']({
'default': {
'error_log_rate': 0.2,
+ 'endpoint_failed_major_threshold': 0.5,
},
}, grain='os_family', merge=salt['pillar.get']('glance:monitoring')) %}
diff --git a/glance/meta/prometheus.yml b/glance/meta/prometheus.yml
index c773098..077999c 100644
--- a/glance/meta/prometheus.yml
+++ b/glance/meta/prometheus.yml
@@ -1,51 +1,75 @@
{%- if pillar.glance.server is defined and pillar.glance.server.get('enabled') %}
{%- from "glance/map.jinja" import monitoring with context %}
+{%- set major_threshold = monitoring.endpoint_failed_major_threshold|float %}
{% raw %}
server:
alert:
- GlanceAPIDown:
+ GlanceApiOutage:
if: >-
- max(openstack_api_check_status{service=~"glance.*"}) by (service) == 0
+ openstack_api_check_status{name="glance"} == 0
+ labels:
+ severity: critical
+ service: glance
+ annotations:
+ summary: "Glance API outage"
+ description: >-
+ Glance API is not accessible for the Glance endpoint in the OpenStack service catalog.
+ GlareApiOutage:
+ if: >-
+ openstack_api_check_status{name="glare"} == 0
+ labels:
+ severity: critical
+ service: glance
+ annotations:
+ summary: "Glare API outage"
+ description: >-
+ Glare API is not accessible for the Glare endpoint in the OpenStack service catalog.
+ GlanceApiEndpointDown:
+ if: >-
+ http_response_status{name=~"glance.*"} == 0
for: 2m
labels:
- severity: down
- service: "{{ $labels.service }}"
+ severity: minor
+ service: glance
annotations:
- summary: "Endpoint check for '{{ $labels.service }}' is down"
+ summary: "{{ $labels.name }} endpoint is not accessible"
description: >-
- Endpoint check for '{{ $labels.service }}' is down for 2 minutes
- GlanceRegistryServiceDown:
- if: >-
- http_response_status{service=~"glance-registry"} == 0
- for: 2m
- labels:
- severity: down
- service: "{{ $labels.service }}"
- annotations:
- summary: "HTTP check for '{{ $labels.service }}' down"
- description: >-
- The HTTP check for '{{ $labels.service }}' is down on {{ $labels.host }} for 2 minutes.
- GlanceAPIServiceDown:
- if: >-
- http_response_status{service=~"glance-api"} == 0
- for: 2m
- labels:
- severity: down
- service: "{{ $labels.service }}"
- annotations:
- summary: "HTTP check for '{{ $labels.service }}' down"
- description: >-
- The HTTP check for '{{ $labels.service }}' is down on {{ $labels.host }} for 2 minutes.
- GlanceErrorLogsTooHigh:
+ The {{ $labels.name }} endpoint on the {{ $labels.host }} node is not accessible for 2 minutes.
{%- endraw %}
+ GlanceApiEndpointsDownMajor:
+ if: >-
+ count(http_response_status{name=~"glance.*"} == 0) by (name) >= count(http_response_status{name=~"glance.*"}) by (name) * {{ major_threshold }}
+ for: 2m
+ labels:
+ severity: major
+ service: glance
+ annotations:
+ summary: "{{major_threshold * 100}}% of {% raw %}{{ $labels.name }} endpoints are not accessible"
+ description: >-
+ {{ $value }} {{ $labels.name }} endpoints (>= {% endraw %}{{major_threshold * 100}}{% raw %}%) are not accessible for 2 minutes.
+ GlanceApiEndpointsOutage:
+ if: >-
+ count(http_response_status{name=~"glance.*"} == 0) by (name) == count(http_response_status{name=~"glance.*"}) by (name)
+ for: 2m
+ labels:
+ severity: critical
+ service: glance
+ annotations:
+ summary: "{{ $labels.name }} endpoints outage"
+ description: >-
+ All available {{ $labels.name }} endpoints are not accessible for 2 minutes.
+{%- endraw %}
+ GlanceErrorLogsTooHigh:
{%- set log_threshold = monitoring.error_log_rate|float %}
if: >-
sum(rate(log_messages{service="glance",level=~"(?i:(error|emergency|fatal))"}[5m])) without (level) > {{ log_threshold }}
{%- raw %}
labels:
severity: warning
- service: "{{ $labels.service }}"
+ service: glance
annotations:
- summary: 'Too many errors in {{ $labels.service }} logs'
- description: 'The rate of errors in {{ $labels.service }} logs over the last 5 minutes is too high on node {{ $labels.host }} (current value={{ $value }}, threshold={%- endraw %}{{ log_threshold }}).'
+ summary: "High number of errors in Glance logs"
+ description: >-
+ The average per-second rate of errors in Glance logs on the {{ $labels.host }} node is {{ $value }} (as measured over the last 5 minutes).
+{%- endraw %}
{%- endif %}
diff --git a/glance/meta/sphinx.yml b/glance/meta/sphinx.yml
index 13450cd..52eab73 100644
--- a/glance/meta/sphinx.yml
+++ b/glance/meta/sphinx.yml
@@ -29,9 +29,18 @@
database_host:
name: "Database"
value: {{ server.database.user }}@{{ server.database.host }}:{{ server.database.port }}//{{ server.database.name }}
+ {%- set rabbit_port = server.message_queue.get('port', 5671 if server.message_queue.get('ssl',{}).get('enabled', False) else 5672) %}
message_queue_ip:
name: "Message queue"
- value: {{ server.message_queue.user }}@{{ server.message_queue.host }}:{{ server.message_queue.port }}{{ server.message_queue.virtual_host }}
+ {%- if server.message_queue.members is defined %}
+ value: {% for member in server.message_queue.members -%}
+ {{ server.message_queue.user }}:{{ server.message_queue.password }}@{{ member.host }}:{{ member.get('port',rabbit_port) }}
+ {%- if not loop.last -%},{%- endif -%}
+ {%- endfor -%}
+ /{{ server.message_queue.virtual_host }}
+ {%- else %}
+ value: {{ server.message_queue.user }}:{{ server.message_queue.password }}@{{ server.message_queue.host }}:{{ rabbit_port }}/{{ server.message_queue.virtual_host }}
+ {%- endif %}
identity_host:
name: "Identity service"
value: {{ server.identity.user }}@{{ server.identity.host }}:{{ server.identity.port }}
diff --git a/glance/meta/telegraf.yml b/glance/meta/telegraf.yml
index 90c2e2d..118af2e 100644
--- a/glance/meta/telegraf.yml
+++ b/glance/meta/telegraf.yml
@@ -7,6 +7,6 @@
address: "http://{{ server.bind.address|replace('0.0.0.0', '127.0.0.1') }}:{{ server.bind.port }}/"
expected_code: 300
glance-registry:
- address: "http://{{ server.registry.host|replace('0.0.0.0', '127.0.0.1') }}:{{ server.registry.port }}/"
+ address: "http://{{ server.bind.address|replace('0.0.0.0', '127.0.0.1') }}:{{ server.registry.port }}/"
expected_code: 401
{%- endif %}
diff --git a/glance/server.sls b/glance/server.sls
index b160b7c..8a7830c 100644
--- a/glance/server.sls
+++ b/glance/server.sls
@@ -1,9 +1,14 @@
{%- from "glance/map.jinja" import server with context %}
{%- if server.enabled %}
+include:
+- glance.db.offline_sync
+
glance_packages:
pkg.installed:
- names: {{ server.pkgs }}
+ - require_in:
+ - sls: glance.db.offline_sync
{%- if not salt['user.info']('glance') %}
glance_user:
@@ -33,36 +38,56 @@
file.managed:
- source: salt://glance/files/{{ server.version }}/glance-cache.conf.{{ grains.os_family }}
- template: jinja
+ - mode: 0640
+ - group: glance
- require:
- pkg: glance_packages
+ - require_in:
+ - sls: glance.db.offline_sync
/etc/glance/glance-registry.conf:
file.managed:
- source: salt://glance/files/{{ server.version }}/glance-registry.conf.{{ grains.os_family }}
- template: jinja
+ - mode: 0640
+ - group: glance
- require:
- pkg: glance_packages
+ - require_in:
+ - sls: glance.db.offline_sync
/etc/glance/glance-scrubber.conf:
file.managed:
- source: salt://glance/files/{{ server.version }}/glance-scrubber.conf.{{ grains.os_family }}
- template: jinja
+ - mode: 0640
+ - group: glance
- require:
- pkg: glance_packages
+ - require_in:
+ - sls: glance.db.offline_sync
/etc/glance/glance-api.conf:
file.managed:
- source: salt://glance/files/{{ server.version }}/glance-api.conf.{{ grains.os_family }}
- template: jinja
+ - mode: 0640
+ - group: glance
- require:
- pkg: glance_packages
+ - require_in:
+ - sls: glance.db.offline_sync
/etc/glance/glance-api-paste.ini:
file.managed:
- source: salt://glance/files/{{ server.version }}/glance-api-paste.ini
- template: jinja
+ - mode: 0640
+ - group: glance
- require:
- pkg: glance_packages
+ - require_in:
+ - sls: glance.db.offline_sync
{%- if server.version == 'newton' or server.version == 'ocata' %}
@@ -74,17 +99,25 @@
file.managed:
- source: salt://glance/files/{{ server.version }}/glance-glare-paste.ini
- template: jinja
+ - mode: 0640
+ - group: glance
- require:
- pkg: glance_packages
- pkg: glance_glare_package
+ - require_in:
+ - sls: glance.db.offline_sync
/etc/glance/glance-glare.conf:
file.managed:
- source: salt://glance/files/{{ server.version }}/glance-glare.conf.{{ grains.os_family }}
- template: jinja
+ - mode: 0640
+ - group: glance
- require:
- pkg: glance_packages
- pkg: glance_glare_package
+ - require_in:
+ - sls: glance.db.offline_sync
{%- if not grains.get('noservices', False) %}
@@ -92,9 +125,8 @@
service.running:
- enable: true
- name: glance-glare
- - require_in:
- - cmd: glance_install_database
- - cmd: glance_load_metadatafs
+ - require:
+ - sls: glance.db.offline_sync
- watch:
- file: /etc/glance/glance-glare.conf
{%- if server.message_queue.get('ssl',{}).get('enabled',False) %}
@@ -145,18 +177,38 @@
- name: python-fluent-logger
{%- endif %}
+glance_general_logging_conf:
+ file.managed:
+ - name: /etc/glance/logging.conf
+ - source: salt://oslo_templates/files/logging/_logging.conf
+ - template: jinja
+ - mode: 0640
+ - user: root
+ - group: glance
+ - defaults:
+ service_name: glance
+ _data: {{ server.logging }}
+ - require:
+ - pkg: glance_packages
+{%- if server.logging.log_handlers.get('fluentd', {}).get('enabled', False) %}
+ - pkg: glance_fluentd_logger_package
+{%- endif %}
+ - watch_in:
+ - service: glance_services
+
{% for service_name in glance_services_list %}
{{ service_name }}_logging_conf:
file.managed:
- name: /etc/glance/logging/logging-{{ service_name }}.conf
- - source: salt://glance/files/logging.conf
+ - source: salt://oslo_templates/files/logging/_logging.conf
- template: jinja
- makedirs: True
- - user: glance
+ - mode: 0640
+ - user: root
- group: glance
- defaults:
service_name: {{ service_name }}
- values: {{ server }}
+ _data: {{ server.logging }}
- require:
- pkg: glance_packages
{%- if glance_glare_available %}
@@ -179,6 +231,8 @@
file.managed:
- source: salt://glance/files/_backends/_swift.conf
- template: jinja
+ - mode: 0640
+ - group: glance
- require:
- pkg: glance_packages
- watch_in:
@@ -191,6 +245,8 @@
service.running:
- enable: true
- names: {{ server.services }}
+ - require:
+ - sls: glance.db.offline_sync
- watch:
- file: /etc/glance/glance-api.conf
- file: /etc/glance/glance-registry.conf
@@ -202,17 +258,6 @@
- file: mysql_ca_glance_server
{% endif %}
-glance_install_database:
- cmd.run:
- - name: glance-manage db_sync
- - require:
- - service: glance_services
-
-glance_load_metadatafs:
- cmd.run:
- - name: glance-manage db_load_metadefs
- - require:
- - cmd: glance_install_database
{%- if server.get('image_cache', {}).get('enabled', False) %}
glance_cron_glance-cache-pruner:
@@ -248,16 +293,18 @@
{%- endif %}
-/srv/glance:
+glance_srv_dir:
file.directory:
+ - name: /srv/glance
- mode: 755
- user: glance
- group: glance
- require:
- pkg: glance_packages
-/var/lib/glance/images:
+glance_images_dir:
file.directory:
+ - name: /var/lib/glance/images
- mode: 755
- user: glance
- group: glance
@@ -285,7 +332,7 @@
{%- endfor %}
-{%- for image_name, image in server.get('image', {}).iteritems() %}
+{%- for image_name, image in server.get('image', {}).items() %}
glance_download_{{ image_name }}:
cmd.run:
@@ -310,8 +357,8 @@
glance_filesystem_store_metadata_file:
file.managed:
- name: {{ server.get('filesystem_store_metadata_file', '/etc/glance/filesystem_store_metadata.json') }}
- - mode: 644
- - user: glance
+ - mode: 0640
+ - user: root
- group: glance
- source: salt://glance/files/filesystem_store_metadata.json_template
- template: jinja
@@ -321,10 +368,10 @@
- service: glance_services
{%- endif %}
-{%- for name, rule in server.get('policy', {}).iteritems() %}
+{%- for name, rule in server.get('policy', {}).items() %}
{%- if rule != None %}
-rule_{{ name }}_present:
+glance_keystone_rule_{{ name }}_present:
keystone_policy.rule_present:
- path: /etc/glance/policy.json
- name: {{ name }}
@@ -334,7 +381,7 @@
{%- else %}
-rule_{{ name }}_absent:
+glance_keystone_rule_{{ name }}_absent:
keystone_policy.rule_absent:
- path: /etc/glance/policy.json
- name: {{ name }}
@@ -373,4 +420,14 @@
{%- endif %}
{%- endif %}
+correct_permissions_files:
+ cmd.run:
+ - name: find /etc/glance/ -type f \( \! -perm 640 -o \! -user root -o \! -group glance \) -execdir chmod 640 {} + -execdir chown root:glance {} +
+ - onlyif: find /etc/glance/ -type f \( \! -perm 640 -o \! -user root -o \! -group glance \) -printf found | grep -q found
+
+correct_permissions_dirs:
+ cmd.run:
+ - name: find /etc/glance/ -type d \( \! -perm 750 -o \! -user root -o \! -group glance \) -execdir chmod 750 {} + -execdir chown root:glance {} +
+ - onlyif: find /etc/glance/ -type d \( \! -perm 750 -o \! -user root -o \! -group glance \) -printf found | grep -q found
+
{%- endif %}
diff --git a/metadata/service/control/cluster.yml b/metadata/service/control/cluster.yml
index 857f2e9..d50efba 100644
--- a/metadata/service/control/cluster.yml
+++ b/metadata/service/control/cluster.yml
@@ -1,12 +1,14 @@
applications:
- glance
classes:
+- service.glance.control.storage.file
- service.glance.support
parameters:
_param:
keystone_glance_endpoint_type: internalURL
openstack_log_appender: false
openstack_fluentd_handler_enabled: false
+ openstack_ossyslog_handler_enabled: false
glance:
server:
enabled: true
@@ -43,6 +45,8 @@
enabled: true
fluentd:
enabled: ${_param:openstack_fluentd_handler_enabled}
+ ossyslog:
+ enabled: ${_param:openstack_ossyslog_handler_enabled}
message_queue:
engine: rabbitmq
host: ${_param:cluster_vip_address}
@@ -50,8 +54,6 @@
user: openstack
password: ${_param:rabbitmq_openstack_password}
virtual_host: '/openstack'
- storage:
- engine: file
cache:
engine: memcached
members:
diff --git a/metadata/service/control/container.yml b/metadata/service/control/container.yml
index 7e19b51..a482b9f 100644
--- a/metadata/service/control/container.yml
+++ b/metadata/service/control/container.yml
@@ -1,3 +1,5 @@
+classes:
+- service.glance.control.storage.file
parameters:
_param:
keystone_glance_endpoint_type: internalURL
@@ -42,7 +44,5 @@
user: openstack
password: ${_param:rabbitmq_openstack_password}
virtual_host: '/openstack'
- storage:
- engine: file
cache:
- engine: memcached
\ No newline at end of file
+ engine: memcached
diff --git a/metadata/service/control/single.yml b/metadata/service/control/single.yml
index a0858c3..0e16de5 100644
--- a/metadata/service/control/single.yml
+++ b/metadata/service/control/single.yml
@@ -1,12 +1,14 @@
applications:
- glance
classes:
+- service.glance.control.storage.file
- service.glance.support
parameters:
_param:
keystone_glance_endpoint_type: internalURL
openstack_log_appender: false
openstack_fluentd_handler_enabled: false
+ openstack_ossyslog_handler_enabled: false
glance:
server:
enabled: true
@@ -41,6 +43,8 @@
enabled: true
fluentd:
enabled: ${_param:openstack_fluentd_handler_enabled}
+ ossyslog:
+ enabled: ${_param:openstack_ossyslog_handler_enabled}
message_queue:
engine: rabbitmq
host: ${_param:single_address}
@@ -48,5 +52,3 @@
user: openstack
password: ${_param:rabbitmq_openstack_password}
virtual_host: '/openstack'
- storage:
- engine: file
diff --git a/metadata/service/control/storage/file.yml b/metadata/service/control/storage/file.yml
new file mode 100644
index 0000000..9f54585
--- /dev/null
+++ b/metadata/service/control/storage/file.yml
@@ -0,0 +1,6 @@
+parameters:
+ glance:
+ server:
+ storage:
+ engine: file
+ default_store: file
diff --git a/metadata/service/control/storage/vmware.yml b/metadata/service/control/storage/vmware.yml
new file mode 100644
index 0000000..b6f286e
--- /dev/null
+++ b/metadata/service/control/storage/vmware.yml
@@ -0,0 +1,17 @@
+parameters:
+ glance:
+ server:
+ storage:
+ engine: vmware
+ default_store: vsphere
+ vmware:
+ enabled: true
+ server_host: ${_param:openstack_vcenter_host}
+ server_username: ${_param:openstack_vcenter_username}
+ server_password: ${_param:openstack_vcenter_password}
+ insecure: true
+ datastores:
+ storage01:
+ enabled: true
+ name: ${_param:openstack_vcenter_storage_name}
+ path: ${_param:openstack_vcenter_datacenter_name}
diff --git a/tests/pillar/cluster.sls b/tests/pillar/cluster.sls
index 7753194..b06af82 100644
--- a/tests/pillar/cluster.sls
+++ b/tests/pillar/cluster.sls
@@ -26,6 +26,15 @@
password: password
region: RegionOne
tenant: service
+ logging:
+ log_appender: false
+ log_handlers:
+ watchedfile:
+ enabled: true
+ fluentd:
+ enabled: false
+ ossyslog:
+ enabled: false
message_queue:
engine: rabbitmq
members:
diff --git a/tests/pillar/single.sls b/tests/pillar/single.sls
index 94e57aa..4da3475 100644
--- a/tests/pillar/single.sls
+++ b/tests/pillar/single.sls
@@ -3,6 +3,7 @@
enabled: true
version: newton
workers: 1
+ enable_proxy_headers_parsing: true
database:
engine: mysql
host: localhost
@@ -25,6 +26,15 @@
region: RegionOne
tenant: service
endpoint_type: internalURL
+ logging:
+ log_appender: false
+ log_handlers:
+ watchedfile:
+ enabled: true
+ fluentd:
+ enabled: false
+ ossyslog:
+ enabled: false
message_queue:
engine: rabbitmq
host: 127.0.0.1
diff --git a/tests/pillar/single_barbican.sls b/tests/pillar/single_barbican.sls
index a54ce12..373a4af 100644
--- a/tests/pillar/single_barbican.sls
+++ b/tests/pillar/single_barbican.sls
@@ -25,6 +25,15 @@
region: RegionOne
tenant: service
endpoint_type: internalURL
+ logging:
+ log_appender: false
+ log_handlers:
+ watchedfile:
+ enabled: true
+ fluentd:
+ enabled: false
+ ossyslog:
+ enabled: false
message_queue:
engine: rabbitmq
host: 127.0.0.1
diff --git a/tests/pillar/single_ceph.sls b/tests/pillar/single_ceph.sls
index 7d6d4e0..a383db3 100644
--- a/tests/pillar/single_ceph.sls
+++ b/tests/pillar/single_ceph.sls
@@ -25,6 +25,15 @@
region: RegionOne
tenant: service
endpoint_type: internalURL
+ logging:
+ log_appender: false
+ log_handlers:
+ watchedfile:
+ enabled: true
+ fluentd:
+ enabled: false
+ ossyslog:
+ enabled: false
message_queue:
engine: rabbitmq
host: 127.0.0.1
diff --git a/tests/pillar/single_image_cache.sls b/tests/pillar/single_image_cache.sls
index 0e1dff8..e9a8288 100644
--- a/tests/pillar/single_image_cache.sls
+++ b/tests/pillar/single_image_cache.sls
@@ -25,6 +25,15 @@
region: RegionOne
tenant: service
endpoint_type: internalURL
+ logging:
+ log_appender: false
+ log_handlers:
+ watchedfile:
+ enabled: true
+ fluentd:
+ enabled: false
+ ossyslog:
+ enabled: false
message_queue:
engine: rabbitmq
host: 127.0.0.1
diff --git a/tests/pillar/single_multiple_backends.sls b/tests/pillar/single_multiple_backends.sls
index 3ca1e4e..8b4fd28 100644
--- a/tests/pillar/single_multiple_backends.sls
+++ b/tests/pillar/single_multiple_backends.sls
@@ -28,6 +28,15 @@
region: RegionOne
tenant: service
endpoint_type: internalURL
+ logging:
+ log_appender: false
+ log_handlers:
+ watchedfile:
+ enabled: true
+ fluentd:
+ enabled: false
+ ossyslog:
+ enabled: false
message_queue:
engine: rabbitmq
host: 127.0.0.1
diff --git a/tests/pillar/single_swift.sls b/tests/pillar/single_swift.sls
index c4ca73b..6cc83e4 100644
--- a/tests/pillar/single_swift.sls
+++ b/tests/pillar/single_swift.sls
@@ -25,6 +25,15 @@
region: RegionOne
tenant: service
endpoint_type: internalURL
+ logging:
+ log_appender: false
+ log_handlers:
+ watchedfile:
+ enabled: true
+ fluentd:
+ enabled: false
+ ossyslog:
+ enabled: false
message_queue:
engine: rabbitmq
host: 127.0.0.1
diff --git a/tests/pillar/single_swift_references.sls b/tests/pillar/single_swift_references.sls
index cdc8797..8c89801 100644
--- a/tests/pillar/single_swift_references.sls
+++ b/tests/pillar/single_swift_references.sls
@@ -25,6 +25,15 @@
region: RegionOne
tenant: service
endpoint_type: internalURL
+ logging:
+ log_appender: false
+ log_handlers:
+ watchedfile:
+ enabled: true
+ fluentd:
+ enabled: false
+ ossyslog:
+ enabled: false
message_queue:
engine: rabbitmq
host: 127.0.0.1
diff --git a/tests/pillar/single_vmware.sls b/tests/pillar/single_vmware.sls
new file mode 100644
index 0000000..2d916f1
--- /dev/null
+++ b/tests/pillar/single_vmware.sls
@@ -0,0 +1,66 @@
+glance:
+ server:
+ enabled: true
+ version: pike
+ workers: 1
+ database:
+ engine: mysql
+ host: localhost
+ port: 3306
+ name: glance
+ user: glance
+ password: password
+ registry:
+ host: 127.0.0.1
+ port: 9191
+ bind:
+ address: 127.0.0.1
+ port: 9292
+ identity:
+ engine: keystone
+ host: 127.0.0.1
+ port: 35357
+ user: glance
+ password: password
+ region: RegionOne
+ tenant: service
+ endpoint_type: internalURL
+ logging:
+ log_appender: false
+ log_handlers:
+ watchedfile:
+ enabled: true
+ fluentd:
+ enabled: false
+ ossyslog:
+ enabled: false
+ message_queue:
+ engine: rabbitmq
+ host: 127.0.0.1
+ port: 5672
+ user: openstack
+ password: password
+ virtual_host: '/openstack'
+ storage:
+ engine: vmware
+ vmware:
+ server_host: 1.2.3.4
+ server_username: vmware_username
+ server_password: vmware_password
+ datastores:
+ data1:
+ enabled: true
+ path: /data1
+ weight: 10
+ data2:
+ enabled: true
+ path: /data2
+ policy:
+ publicize_image: "role:admin"
+ add_member:
+ quota:
+ image_member: -1
+ image_property: 256
+ image_tag: 256
+ image_location: 15
+ user_storage: 0
diff --git a/tests/run_tests.sh b/tests/run_tests.sh
index db89554..9761585 100755
--- a/tests/run_tests.sh
+++ b/tests/run_tests.sh
@@ -6,11 +6,13 @@
CURDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
METADATA=${CURDIR}/../metadata.yml
FORMULA_NAME=$(cat $METADATA | python -c "import sys,yaml; print yaml.load(sys.stdin)['name']")
+FORMULA_META_DIR=${CURDIR}/../${FORMULA_NAME}/meta
## Overrideable parameters
PILLARDIR=${PILLARDIR:-${CURDIR}/pillar}
BUILDDIR=${BUILDDIR:-${CURDIR}/build}
VENV_DIR=${VENV_DIR:-${BUILDDIR}/virtualenv}
+MOCK_BIN_DIR=${MOCK_BIN_DIR:-${CURDIR}/mock_bin}
DEPSDIR=${BUILDDIR}/deps
SALT_FILE_DIR=${SALT_FILE_DIR:-${BUILDDIR}/file_root}
@@ -37,7 +39,16 @@
log_info "Setting up Python virtualenv"
virtualenv $VENV_DIR
source ${VENV_DIR}/bin/activate
- pip install salt${PIP_SALT_VERSION}
+ python -m pip install salt${PIP_SALT_VERSION}
+}
+
+setup_mock_bin() {
+ # If some state requires a binary, a lightweight replacement for
+ # such binary can be put into MOCK_BIN_DIR for test purposes
+ if [ -d "${MOCK_BIN_DIR}" ]; then
+ PATH="${MOCK_BIN_DIR}:$PATH"
+ export PATH
+ fi
}
setup_pillar() {
@@ -114,13 +125,14 @@
salt_run() {
[ -e ${VENV_DIR}/bin/activate ] && source ${VENV_DIR}/bin/activate
- salt-call ${SALT_OPTS} $*
+ python $(which salt-call) ${SALT_OPTS} $*
}
prepare() {
[ -d ${BUILDDIR} ] && mkdir -p ${BUILDDIR}
which salt-call || setup_virtualenv
+ setup_mock_bin
setup_pillar
setup_salt
install_dependencies
@@ -130,7 +142,26 @@
for pillar in ${PILLARDIR}/*.sls; do
grep ${FORMULA_NAME}: ${pillar} &>/dev/null || continue
state_name=$(basename ${pillar%.sls})
+ salt_run grains.set 'noservices' False force=True
+
+ echo "Checking state ${FORMULA_NAME}.${state_name} ..."
salt_run --id=${state_name} state.show_sls ${FORMULA_NAME} || (log_err "Execution of ${FORMULA_NAME}.${state_name} failed"; exit 1)
+
+ # Check that all files in 'meta' folder can be rendered using any valid pillar
+ for meta in `find ${FORMULA_META_DIR} -type f`; do
+ meta_name=$(basename ${meta})
+ echo "Checking meta ${meta_name} ..."
+ salt_run --out=quiet --id=${state_name} cp.get_template ${meta} ${SALT_CACHE_DIR}/${meta_name} \
+ || (log_err "Failed to render meta ${meta} using pillar ${FORMULA_NAME}.${state_name}"; exit 1)
+ cat ${SALT_CACHE_DIR}/${meta_name}
+ done
+ done
+}
+
+real_run() {
+ for pillar in ${PILLARDIR}/*.sls; do
+ state_name=$(basename ${pillar%.sls})
+ salt_run --id=${state_name} state.sls ${FORMULA_NAME} || (log_err "Execution of ${FORMULA_NAME}.${state_name} failed"; exit 1)
done
}
@@ -159,6 +190,9 @@
run)
run
;;
+ real-run)
+ real_run
+ ;;
*)
prepare
run