Merge "Fix for differentiating no data vs 0s"
diff --git a/.kitchen.yml b/.kitchen.yml
new file mode 100644
index 0000000..bf95612
--- /dev/null
+++ b/.kitchen.yml
@@ -0,0 +1,49 @@
+---
+driver:
+  name: docker
+  hostname: cinder.ci.local
+  use_sudo: false
+
+provisioner:
+  name: salt_solo
+  salt_install: bootstrap
+  salt_bootstrap_url: https://bootstrap.saltstack.com
+  salt_version: latest
+  require_chef: false
+  log_level: error
+  formula: cinder
+  grains:
+    noservices: True
+  state_top:
+    base:
+      "*":
+        - cinder
+  pillars:
+    top.sls:
+      base:
+        "*":
+          - cinder
+
+verifier:
+  name: inspec
+  sudo: true
+
+platforms:
+  - name: ubuntu-trusty
+    driver_config:
+      image: trevorj/salty-whales:trusty
+      platform: ubuntu
+
+  - name: ubuntu-xenial
+    driver_config:
+      image: trevorj/salty-whales:xenial
+      platform: ubuntu
+
+suites:
+
+  - name: <%=ENV['SUITE'] || 'ceph_single'%>
+    provisioner:
+      pillars-from-files:
+        cinder.sls: tests/pillar/<%=ENV['SUITE'] || 'ceph_single'%>.sls
+
+# vim: ft=yaml sw=2 ts=2 sts=2 tw=125
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..c1872fe
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,47 @@
+sudo: required
+services:
+  - docker
+
+install:
+  - pip install PyYAML
+  - pip install virtualenv
+  - |
+    test -e Gemfile || cat <<EOF > Gemfile
+    source 'https://rubygems.org'
+    gem 'rake'
+    gem 'test-kitchen'
+    gem 'kitchen-docker'
+    gem 'kitchen-inspec'
+    gem 'inspec'
+    gem 'kitchen-salt', :git => 'https://github.com/salt-formulas/kitchen-salt.git'
+  - bundle install
+
+env:
+    - SUITE=ceph_single
+    - SUITE=control_cluster
+    - SUITE=control_single
+    - SUITE=gpfs_single
+    - SUITE=hp3par_single
+    - SUITE=lefthand_single
+    - SUITE=solidfire_single
+    - SUITE=storwize_single
+    - SUITE=volume_single
+    - SUITE=vsp_single
+
+before_script:
+  - set -o pipefail
+  - make test | tail
+
+script:
+  - test ! -e .kitchen.yml || bundle exec kitchen test -t tests/integration
+
+notifications:
+  webhooks:
+    urls:
+      - https://webhooks.gitter.im/e/6123573504759330786b
+    on_success: change  # options: [always|never|change] default: always
+    on_failure: never  # options: [always|never|change] default: always
+    on_start: never     # options: [always|never|change] default: always
+    on_cancel: never    # options: [always|never|change] default: always
+    on_error: never    # options: [always|never|change] default: always
+  email: false
diff --git a/README.rst b/README.rst
index 7d6c011..7e02a05 100644
--- a/README.rst
+++ b/README.rst
@@ -96,6 +96,7 @@
             pool: SAS7K2
         audit:
           enabled: false
+    
 
 Client-side RabbitMQ HA setup for controller
 
@@ -232,6 +233,26 @@
             multipath: true
             pool: SAS15K
 
+
+Cinder setup with NFS
+
+.. code-block:: yaml
+
+    cinder:
+      controller:
+        enabled: true
+        default_volume_type: nfs-driver
+        backend:
+          nfs-driver:
+            engine: nfs
+            type_name: nfs-driver
+            volume_group: cinder-volume
+            path: /var/lib/cinder/nfs
+            devices:
+            - 172.16.10.110:/var/nfs/cinder
+            options: rw,sync
+
+
 Cinder setup with Hitachi VPS
 
 .. code-block:: yaml
@@ -388,8 +409,36 @@
             clustername: cluster1
             sf_emulate_512: false
 
+Enable cinder-backup service for ceph
 
+.. code-block:: yaml
 
+    cinder:
+      controller:
+        enabled: true
+        version: mitaka
+        backup:
+          engine: ceph
+          ceph_conf: "/etc/ceph/ceph.conf"
+          ceph_pool: backup
+          ceph_stripe_count: 0
+          ceph_stripe_unit: 0
+          ceph_user: cinder
+          ceph_chunk_size: 134217728
+          restore_discard_excess_bytes: false
+      volume:
+        enabled: true
+        version: mitaka
+        backup:
+          engine: ceph
+          ceph_conf: "/etc/ceph/ceph.conf"
+          ceph_pool: backup
+          ceph_stripe_count: 0
+          ceph_stripe_unit: 0
+          ceph_user: cinder
+          ceph_chunk_size: 134217728
+          restore_discard_excess_bytes: false
+          
 Enable auditing filter, ie: CADF
 
 .. code-block:: yaml
@@ -423,6 +472,21 @@
         default_availability_zone: my-default-zone
         storage_availability_zone: my-custom-zone-name
 
+
+Cinder setup with custom non-admin volume query filters:
+
+.. code-block:: yaml
+
+    cinder:
+      controller:
+        query_volume_filters:
+          - name
+          - status
+          - metadata
+          - availability_zone
+          - bootable
+
+
 public_endpoint and osapi_volume_base_url parameters:
 "public_endpoint" is used for configuring versions endpoint,
 "osapi_volume_base_URL" is used to present Cinder URL to users.
diff --git a/cinder/controller.sls b/cinder/controller.sls
index a10d5d9..a50a3ca 100644
--- a/cinder/controller.sls
+++ b/cinder/controller.sls
@@ -22,6 +22,41 @@
   - require:
     - pkg: cinder_controller_packages
 
+{%- if controller.version == 'ocata' %}
+
+/etc/apache2/conf-available/cinder-wsgi.conf:
+  file.managed:
+  - source: salt://cinder/files/{{ controller.version }}/cinder-wsgi.conf
+  - template: jinja
+  - require:
+    - pkg: cinder_controller_packages
+
+{%- if not grains.get('noservices', False) %}
+cinder_api_service:
+  service.running:
+  - name: apache2
+  - enable: true
+  - watch:
+    - file: /etc/cinder/cinder.conf
+    - file: /etc/cinder/api-paste.ini
+    - file: /etc/apache2/conf-available/cinder-wsgi.conf
+{%- endif %}
+
+{%- else %}
+
+{%- if not grains.get('noservices', False) %}
+cinder_api_service:
+  service.running:
+  - name: cinder-api
+  - enable: true
+  - watch:
+    - file: /etc/cinder/cinder.conf
+    - file: /etc/cinder/api-paste.ini
+{%- endif %}
+
+{%- endif %}
+
+
 {%- if grains.get('virtual_subtype', None) == "Docker" %}
 
 cinder_entrypoint:
@@ -53,6 +88,18 @@
 
 {%- for backend_name, backend in controller.get('backend', {}).iteritems() %}
 
+{%- if backend.engine is defined and backend.engine == 'nfs' %}
+/etc/cinder/nfs_shares_{{ backend_name }}:
+  file.managed:
+  - source: salt://cinder/files/{{ controller.version }}/nfs_shares
+  - defaults:
+      backend: {{ backend|yaml }}
+  - template: jinja
+  - require:
+    - pkg: cinder_controller_packages
+
+{%- endif %}
+
 cinder_type_create_{{ backend_name }}:
   cmd.run:
   - name: "source /root/keystonerc; cinder type-create {{ backend.type_name }}"
@@ -95,4 +142,20 @@
 
 {% endfor %}
 
+{%- if controller.backup.engine != None %}
+
+cinder_backup_packages:
+  pkg.installed:
+  - names: {{ controller.backup.pkgs }}
+
+cinder_backup_services:
+  service.running:
+  - names: {{ controller.backup.services }}
+  - enable: true
+  - watch:
+    - file: /etc/cinder/cinder.conf
+    - file: /etc/cinder/api-paste.ini
+
 {%- endif %}
+
+{%- endif %}
\ No newline at end of file
diff --git a/cinder/files/backend/_ceph.conf b/cinder/files/backend/_ceph.conf
index 6455459..c57483d 100644
--- a/cinder/files/backend/_ceph.conf
+++ b/cinder/files/backend/_ceph.conf
@@ -22,6 +22,7 @@
 # Flatten volumes created from snapshots to remove dependency
 # from volume to snapshot (boolean value)
 #rbd_flatten_volume_from_snapshot=false
+rbd_flatten_volume_from_snapshot={{ backend.get('flatten_volume_from_snapshot', False)|lower }}
 
 # The libvirt uuid of the secret for the rbd_user volumes
 # (string value)
@@ -45,4 +46,4 @@
 # Timeout value (in seconds) used when connecting to ceph
 # cluster. If value < 0, no timeout is set and default
 # librados value is used. (integer value)
-#rados_connect_timeout=-1
\ No newline at end of file
+#rados_connect_timeout=-1
diff --git a/cinder/files/backend/_hp3par.conf b/cinder/files/backend/_hp3par.conf
index 78ddfb7..4ed19ec 100644
--- a/cinder/files/backend/_hp3par.conf
+++ b/cinder/files/backend/_hp3par.conf
@@ -5,7 +5,7 @@
 hp3par_api_url={{ backend.url }}
 
 # 3PAR Super user username
-hp3par_username={{ backend.storage.user }}
+hp3par_username={{ backend.user }}
 
 # 3PAR Super user password
 hp3par_password={{ backend.password }}
diff --git a/cinder/files/backend/_nfs.conf b/cinder/files/backend/_nfs.conf
new file mode 100644
index 0000000..26e8e66
--- /dev/null
+++ b/cinder/files/backend/_nfs.conf
@@ -0,0 +1,11 @@
+
+[{{ backend_name }}]
+backend_host={{ backend.get('host', grains.host) }}
+volume_driver = cinder.volume.drivers.nfs.NfsDriver
+volume_backend_name={{ backend_name }}
+
+nfs_mount_attempts = 3
+nfs_mount_options = {{ backend.get('options', None) }}
+nfs_mount_point_base = {{ backend.get('path', '/mnt') }}
+nfs_shares_config = /etc/cinder/nfs_shares_{{ backend_name }}
+nfs_sparsed_volumes = True
diff --git a/cinder/files/backup_backend/_ceph.conf b/cinder/files/backup_backend/_ceph.conf
new file mode 100644
index 0000000..34a7465
--- /dev/null
+++ b/cinder/files/backup_backend/_ceph.conf
@@ -0,0 +1,8 @@
+#backup conf
+backup_driver=cinder.backup.drivers.{{ controller.backup.engine }}
+backup_ceph_conf={{ controller.backup.get('ceph_conf', '/etc/ceph/ceph.conf') }}
+backup_ceph_user = {{ controller.backup.get('ceph_user', cinder) }}
+backup_ceph_chunk_size = {{ controller.backup.get('ceph_chunk_size', 134217728 )}}
+backup_ceph_pool = {{ controller.backup.get('ceph_pool', backup) }}
+backup_ceph_stripe_unit = {{ controller.backup.get('ceph_stripe_unit', 0) }}
+backup_ceph_stripe_count = {{ controller.backup.get('ceph_stripe_count', 0) }}
\ No newline at end of file
diff --git a/cinder/files/juno/cinder.conf.controller.Debian b/cinder/files/juno/cinder.conf.controller.Debian
index 3961e82..65bceb1 100644
--- a/cinder/files/juno/cinder.conf.controller.Debian
+++ b/cinder/files/juno/cinder.conf.controller.Debian
@@ -265,6 +265,7 @@
 # Flatten volumes created from snapshots to remove dependency
 # from volume to snapshot (boolean value)
 #rbd_flatten_volume_from_snapshot=false
+rbd_flatten_volume_from_snapshot={{ controller.storage.get('flatten_volume_from_snapshot', False)|lower }}
 
 # The libvirt uuid of the secret for the rbd_user volumes
 # (string value)
diff --git a/cinder/files/juno/cinder.conf.volume.Debian b/cinder/files/juno/cinder.conf.volume.Debian
index 64e0050..9888ad8 100644
--- a/cinder/files/juno/cinder.conf.volume.Debian
+++ b/cinder/files/juno/cinder.conf.volume.Debian
@@ -329,6 +329,7 @@
 # Flatten volumes created from snapshots to remove dependency
 # from volume to snapshot (boolean value)
 #rbd_flatten_volume_from_snapshot=false
+rbd_flatten_volume_from_snapshot={{ volume.storage.get('flatten_volume_from_snapshot', False)|lower }}
 
 # The libvirt uuid of the secret for the rbd_user volumes
 # (string value)
diff --git a/cinder/files/kilo/cinder.conf.controller.Debian b/cinder/files/kilo/cinder.conf.controller.Debian
index d35b484..bb8320f 100644
--- a/cinder/files/kilo/cinder.conf.controller.Debian
+++ b/cinder/files/kilo/cinder.conf.controller.Debian
@@ -302,6 +302,7 @@
 # Flatten volumes created from snapshots to remove dependency
 # from volume to snapshot (boolean value)
 #rbd_flatten_volume_from_snapshot=false
+rbd_flatten_volume_from_snapshot={{ controller.storage.get('flatten_volume_from_snapshot', False)|lower }}
 
 # The libvirt uuid of the secret for the rbd_user volumes
 # (string value)
diff --git a/cinder/files/kilo/cinder.conf.volume.Debian b/cinder/files/kilo/cinder.conf.volume.Debian
index 8bf4f8b..f820362 100644
--- a/cinder/files/kilo/cinder.conf.volume.Debian
+++ b/cinder/files/kilo/cinder.conf.volume.Debian
@@ -366,6 +366,7 @@
 # Flatten volumes created from snapshots to remove dependency
 # from volume to snapshot (boolean value)
 #rbd_flatten_volume_from_snapshot=false
+rbd_flatten_volume_from_snapshot={{ volume.storage.get('flatten_volume_from_snapshot', False)|lower }}
 
 # The libvirt uuid of the secret for the rbd_user volumes
 # (string value)
diff --git a/cinder/files/liberty/cinder.conf.controller.Debian b/cinder/files/liberty/cinder.conf.controller.Debian
index 4e9582d..460f0b0 100644
--- a/cinder/files/liberty/cinder.conf.controller.Debian
+++ b/cinder/files/liberty/cinder.conf.controller.Debian
@@ -24,6 +24,11 @@
 state_path = /var/lib/cinder
 lock_path = /var/lock/cinder
 
+{%- if controller.query_volume_filters is defined %}
+# Available query filters for non-admin user
+query_volume_filters = {{ controller.query_volume_filters|join(",") }}
+{%- endif %}
+
 use_syslog=False
 
 glance_num_retries=0
@@ -87,7 +92,6 @@
 notification_driver = messagingv2
 {%- endif %}
 
-
 volume_name_template = volume-%s
 
 #volume_group = vg_cinder_volume
@@ -315,6 +319,7 @@
 # Flatten volumes created from snapshots to remove dependency
 # from volume to snapshot (boolean value)
 #rbd_flatten_volume_from_snapshot=false
+rbd_flatten_volume_from_snapshot={{ controller.storage.get('flatten_volume_from_snapshot', False)|lower }}
 
 # The libvirt uuid of the secret for the rbd_user volumes
 # (string value)
diff --git a/cinder/files/liberty/cinder.conf.volume.Debian b/cinder/files/liberty/cinder.conf.volume.Debian
index 0ab8e54..12582c1 100644
--- a/cinder/files/liberty/cinder.conf.volume.Debian
+++ b/cinder/files/liberty/cinder.conf.volume.Debian
@@ -360,6 +360,7 @@
 # Flatten volumes created from snapshots to remove dependency
 # from volume to snapshot (boolean value)
 #rbd_flatten_volume_from_snapshot=false
+rbd_flatten_volume_from_snapshot={{ volume.storage.get('flatten_volume_from_snapshot', False)|lower }}
 
 # The libvirt uuid of the secret for the rbd_user volumes
 # (string value)
diff --git a/cinder/files/liberty/nfs_shares b/cinder/files/liberty/nfs_shares
new file mode 100644
index 0000000..9878dca
--- /dev/null
+++ b/cinder/files/liberty/nfs_shares
@@ -0,0 +1,3 @@
+{%- for nfs_server in backend.devices %}
+{{ nfs_server }}
+{%- endfor %}
\ No newline at end of file
diff --git a/cinder/files/mitaka/cinder.conf.controller.Debian b/cinder/files/mitaka/cinder.conf.controller.Debian
index 6ce59df..d58a006 100644
--- a/cinder/files/mitaka/cinder.conf.controller.Debian
+++ b/cinder/files/mitaka/cinder.conf.controller.Debian
@@ -78,6 +78,15 @@
 verbose=True
 lock_path=/var/lock/cinder
 
+{%- if controller.query_volume_filters is defined %}
+query_volume_filters = {{ controller.query_volume_filters|join(",") }}
+{%- endif %}
+
+{%- if controller.backup.engine != None %}
+{%- set backup_backend_fragment = "cinder/files/backup_backend/_" + controller.backup.engine + ".conf" %}
+{%- include backup_backend_fragment %}
+{%- endif %}
+
 [oslo_messaging_notifications]
 {%- if controller.notification is mapping %}
 driver = {{ controller.notification.get('driver', 'messagingv2') }}
diff --git a/cinder/files/mitaka/cinder.conf.volume.Debian b/cinder/files/mitaka/cinder.conf.volume.Debian
index beb8008..f3633e6 100644
--- a/cinder/files/mitaka/cinder.conf.volume.Debian
+++ b/cinder/files/mitaka/cinder.conf.volume.Debian
@@ -75,6 +75,11 @@
 use_syslog=false
 verbose=True
 
+{%- if volume.backup.engine != None %}
+{%- set backup_backend_fragment = "cinder/files/backup_backend/_" + volume.backup.engine + ".conf" %}
+{%- include backup_backend_fragment %}
+{%- endif %}
+
 [oslo_messaging_notifications]
 {%- if volume.notification is mapping %}
 driver = {{ volume.notification.get('driver', 'messagingv2') }}
diff --git a/cinder/files/mitaka/nfs_shares b/cinder/files/mitaka/nfs_shares
new file mode 100644
index 0000000..9878dca
--- /dev/null
+++ b/cinder/files/mitaka/nfs_shares
@@ -0,0 +1,3 @@
+{%- for nfs_server in backend.devices %}
+{{ nfs_server }}
+{%- endfor %}
\ No newline at end of file
diff --git a/cinder/files/newton/cinder.conf.controller.Debian b/cinder/files/newton/cinder.conf.controller.Debian
index a0c4c53..550f3c3 100644
--- a/cinder/files/newton/cinder.conf.controller.Debian
+++ b/cinder/files/newton/cinder.conf.controller.Debian
@@ -28,10 +28,19 @@
 
 osapi_volume_listen={{ controller.osapi.host }}
 
+glance_api_servers = http://{{ controller.glance.host }}:{{ controller.glance.port }}
+
 glance_host={{ controller.glance.host }}
 glance_port={{ controller.glance.port }}
 glance_api_version=2
 
+enable_v3_api = True
+
+os_privileged_user_name={{ controller.identity.user }}
+os_privileged_user_password={{ controller.identity.password }}
+os_privileged_user_tenant={{ controller.identity.tenant }}
+os_privileged_user_auth_url=http://{{ controller.identity.host }}:5000/v3/
+
 volume_backend_name=DEFAULT
 
 {%- if controller.backend is defined %}
@@ -77,11 +86,30 @@
 verbose=True
 lock_path=/var/lock/cinder
 
+{%- if controller.query_volume_filters is defined %}
+query_volume_filters = {{ controller.query_volume_filters|join(",") }}
+{%- endif %}
+
 nova_catalog_admin_info = compute:nova:adminURL
-nova_catalog_info = compute:nova:{{ server.identity.get('endpoint_type', 'publicURL') }}
+nova_catalog_info = compute:nova:{{ controller.identity.get('endpoint_type', 'publicURL') }}
 
 osapi_volume_extension = cinder.api.contrib.standard_extensions
 
+{%- if controller.message_queue.members is defined %}
+transport_url = rabbit://{% for member in controller.message_queue.members -%}
+                             {{ controller.message_queue.user }}:{{ controller.message_queue.password }}@{{ member.host }}:{{ member.get('port', 5672) }}
+                             {%- if not loop.last -%},{%- endif -%}
+                         {%- endfor -%}
+                             /{{ controller.message_queue.virtual_host }}
+{%- else %}
+transport_url = rabbit://{{ controller.message_queue.user }}:{{ controller.message_queue.password }}@{{ controller.message_queue.host }}:{{ controller.message_queue.port }}/{{ controller.message_queue.virtual_host }}
+{%- endif %}
+
+{%- if controller.backup.engine != None %}
+{%- set backup_backend_fragment = "cinder/files/backup_backend/_" + controller.backup.engine + ".conf" %}
+{%- include backup_backend_fragment %}
+{%- endif %}
+
 [oslo_messaging_notifications]
 {%- if controller.notification is mapping %}
 driver = {{ controller.notification.get('driver', 'messagingv2') }}
@@ -96,21 +124,11 @@
 
 lock_path=/var/lock/cinder
 
-[oslo_messaging_rabbit]
-{%- if controller.message_queue.members is defined %}
-rabbit_hosts = {% for member in controller.message_queue.members -%}
-                   {{ member.host }}:{{ member.get('port', 5672) }}
-                   {%- if not loop.last -%},{%- endif -%}
-               {%- endfor -%}
-{%- else %}
-rabbit_host = {{ controller.message_queue.host }}
-rabbit_port = {{ controller.message_queue.port }}
-{%- endif %}
+[oslo_middleware]
 
-rabbit_userid = {{ controller.message_queue.user }}
-rabbit_password = {{ controller.message_queue.password }}
-rabbit_virtual_host = {{ controller.message_queue.virtual_host }}
-kombu_reconnect_delay=5.0
+enable_proxy_headers_parsing = True
+
+[oslo_messaging_rabbit]
 
 [keystone_authtoken]
 signing_dir=/tmp/keystone-signing-cinder
@@ -130,13 +148,17 @@
 {%- if controller.cache is defined %}
 memcached_servers={%- for member in controller.cache.members %}{{ member.host }}:11211{% if not loop.last %},{% endif %}{%- endfor %}
 {%- endif %}
+auth_version = v3
+
+[barbican]
+auth_endpoint=http://{{ controller.identity.host }}:5000
 
 [database]
 idle_timeout=3600
 max_pool_size=30
 max_retries=-1
 max_overflow=40
-connection = {{ controller.database.engine }}+pymysql://{{ controller.database.user }}:{{ controller.database.password }}@{{ controller.database.host }}/{{ controller.database.name }}
+connection = {{ controller.database.engine }}+pymysql://{{ controller.database.user }}:{{ controller.database.password }}@{{ controller.database.host }}/{{ controller.database.name }}?charset=utf8
 
 {%- if controller.backend is defined %}
 
diff --git a/cinder/files/newton/cinder.conf.volume.Debian b/cinder/files/newton/cinder.conf.volume.Debian
index a8d4f7b..1124056 100644
--- a/cinder/files/newton/cinder.conf.volume.Debian
+++ b/cinder/files/newton/cinder.conf.volume.Debian
@@ -28,10 +28,17 @@
 
 osapi_volume_listen={{ volume.osapi.host }}
 
+glance_api_servers = http://{{ volume.glance.host }}:{{ volume.glance.port }}
+
 glance_host={{ volume.glance.host }}
 glance_port={{ volume.glance.port }}
 glance_api_version=2
 
+os_privileged_user_name={{ volume.identity.user }}
+os_privileged_user_password={{ volume.identity.password }}
+os_privileged_user_tenant={{ volume.identity.tenant }}
+os_privileged_user_auth_url=http://{{ volume.identity.host }}:5000/v3/
+
 volume_backend_name=DEFAULT
 
 {%- if volume.backend is defined %}
@@ -76,7 +83,22 @@
 verbose=True
 
 nova_catalog_admin_info = compute:nova:adminURL
-nova_catalog_info = compute:nova:{{ server.identity.get('endpoint_type', 'publicURL') }}
+nova_catalog_info = compute:nova:{{ volume.identity.get('endpoint_type', 'publicURL') }}
+
+{%- if volume.message_queue.members is defined %}
+transport_url = rabbit://{% for member in volume.message_queue.members -%}
+                             {{ volume.message_queue.user }}:{{ volume.message_queue.password }}@{{ member.host }}:{{ member.get('port', 5672) }}
+                             {%- if not loop.last -%},{%- endif -%}
+                         {%- endfor -%}
+                             /{{ volume.message_queue.virtual_host }}
+{%- else %}
+transport_url = rabbit://{{ volume.message_queue.user }}:{{ volume.message_queue.password }}@{{ volume.message_queue.host }}:{{ volume.message_queue.port }}/{{ volume.message_queue.virtual_host }}
+{%- endif %}
+
+{%- if volume.backup.engine != None %}
+{%- set backup_backend_fragment = "cinder/files/backup_backend/_" + volume.backup.engine + ".conf" %}
+{%- include backup_backend_fragment %}
+{%- endif %}
 
 [oslo_messaging_notifications]
 {%- if volume.notification is mapping %}
@@ -92,21 +114,11 @@
 
 lock_path=/var/lock/cinder
 
-[oslo_messaging_rabbit]
-{%- if volume.message_queue.members is defined %}
-rabbit_hosts = {% for member in volume.message_queue.members -%}
-                   {{ member.host }}:{{ member.get('port', 5672) }}
-                   {%- if not loop.last -%},{%- endif -%}
-               {%- endfor -%}
-{%- else %}
-rabbit_host = {{ volume.message_queue.host }}
-rabbit_port = {{ volume.message_queue.port }}
-{%- endif %}
+[oslo_middleware]
 
-rabbit_userid = {{ volume.message_queue.user }}
-rabbit_password = {{ volume.message_queue.password }}
-rabbit_virtual_host = {{ volume.message_queue.virtual_host }}
-kombu_reconnect_delay=5.0
+enable_proxy_headers_parsing = True
+
+[oslo_messaging_rabbit]
 
 [keystone_authtoken]
 signing_dir=/tmp/keystone-signing-cinder
@@ -126,13 +138,17 @@
 {%- if volume.cache is defined %}
 memcached_servers={%- for member in volume.cache.members %}{{ member.host }}:11211{% if not loop.last %},{% endif %}{%- endfor %}
 {%- endif %}
+auth_version = v3
+
+[barbican]
+auth_endpoint=http://{{ controller.identity.host }}:5000
 
 [database]
 idle_timeout=3600
 max_pool_size=30
 max_retries=-1
 max_overflow=40
-connection = {{ volume.database.engine }}+pymysql://{{ volume.database.user }}:{{ volume.database.password }}@{{ volume.database.host }}/{{ volume.database.name }}
+connection = {{ volume.database.engine }}+pymysql://{{ volume.database.user }}:{{ volume.database.password }}@{{ volume.database.host }}/{{ volume.database.name }}?charset=utf8
 
 {%- if volume.backend is defined %}
 
diff --git a/cinder/files/newton/nfs_shares b/cinder/files/newton/nfs_shares
new file mode 100644
index 0000000..9878dca
--- /dev/null
+++ b/cinder/files/newton/nfs_shares
@@ -0,0 +1,3 @@
+{%- for nfs_server in backend.devices %}
+{{ nfs_server }}
+{%- endfor %}
\ No newline at end of file
diff --git a/cinder/files/ocata/api-paste.ini.controller.Debian b/cinder/files/ocata/api-paste.ini.controller.Debian
new file mode 100644
index 0000000..aada960
--- /dev/null
+++ b/cinder/files/ocata/api-paste.ini.controller.Debian
@@ -0,0 +1,83 @@
+#############
+# OpenStack #
+#############
+{%- from "cinder/map.jinja" import controller with context %}
+
+[composite:osapi_volume]
+use = call:cinder.api:root_app_factory
+/: apiversions
+/v1: openstack_volume_api_v1
+/v2: openstack_volume_api_v2
+/v3: openstack_volume_api_v3
+
+[composite:openstack_volume_api_v1]
+use = call:cinder.api.middleware.auth:pipeline_factory
+noauth = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler noauth apiv1
+keystone = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext {% if controller.audit.enabled %}audit {% endif %}apiv1
+keystone_nolimit = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext {% if controller.audit.enabled %}audit {% endif %}apiv1
+
+[composite:openstack_volume_api_v2]
+use = call:cinder.api.middleware.auth:pipeline_factory
+noauth = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler noauth apiv2
+keystone = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext {% if controller.audit.enabled %}audit {% endif %}apiv2
+keystone_nolimit = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext {% if controller.audit.enabled %}audit {% endif %}apiv2
+
+[composite:openstack_volume_api_v3]
+use = call:cinder.api.middleware.auth:pipeline_factory
+noauth = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler noauth apiv3
+keystone = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext apiv3
+keystone_nolimit = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext apiv3
+
+[filter:request_id]
+paste.filter_factory = oslo_middleware.request_id:RequestId.factory
+
+[filter:http_proxy_to_wsgi]
+paste.filter_factory = oslo_middleware.http_proxy_to_wsgi:HTTPProxyToWSGI.factory
+
+[filter:cors]
+paste.filter_factory = oslo_middleware.cors:filter_factory
+oslo_config_project = cinder
+
+[filter:faultwrap]
+paste.filter_factory = cinder.api.middleware.fault:FaultWrapper.factory
+
+[filter:osprofiler]
+paste.filter_factory = osprofiler.web:WsgiMiddleware.factory
+
+[filter:noauth]
+paste.filter_factory = cinder.api.middleware.auth:NoAuthMiddleware.factory
+
+[filter:sizelimit]
+paste.filter_factory = oslo_middleware.sizelimit:RequestBodySizeLimiter.factory
+
+[app:apiv1]
+paste.app_factory = cinder.api.v1.router:APIRouter.factory
+
+[app:apiv2]
+paste.app_factory = cinder.api.v2.router:APIRouter.factory
+
+[app:apiv3]
+paste.app_factory = cinder.api.v3.router:APIRouter.factory
+
+[pipeline:apiversions]
+pipeline = cors http_proxy_to_wsgi faultwrap osvolumeversionapp
+
+[app:osvolumeversionapp]
+paste.app_factory = cinder.api.versions:Versions.factory
+
+##########
+# Shared #
+##########
+
+[filter:keystonecontext]
+paste.filter_factory = cinder.api.middleware.auth:CinderKeystoneContext.factory
+
+[filter:authtoken]
+paste.filter_factory = keystonemiddleware.auth_token:filter_factory
+
+{%- if controller.audit.enabled %}
+[filter:audit]
+paste.filter_factory = {{ controller.get("audit", {}).get("filter_factory", "keystonemiddleware.audit:filter_factory")   }}
+audit_map_file = {{ controller.get("audit", {}).get("map_file", "/etc/pycadf/cinder_api_audit_map.conf")  }}
+{%- endif %}
+
diff --git a/cinder/files/ocata/api-paste.ini.controller.RedHat b/cinder/files/ocata/api-paste.ini.controller.RedHat
new file mode 120000
index 0000000..341baca
--- /dev/null
+++ b/cinder/files/ocata/api-paste.ini.controller.RedHat
@@ -0,0 +1 @@
+api-paste.ini.controller.Debian
\ No newline at end of file
diff --git a/cinder/files/ocata/api-paste.ini.volume.Debian b/cinder/files/ocata/api-paste.ini.volume.Debian
new file mode 100644
index 0000000..e4944ec
--- /dev/null
+++ b/cinder/files/ocata/api-paste.ini.volume.Debian
@@ -0,0 +1,82 @@
+#############
+# OpenStack #
+#############
+{%- from "cinder/map.jinja" import volume with context %}
+
+[composite:osapi_volume]
+use = call:cinder.api:root_app_factory
+/: apiversions
+/v1: openstack_volume_api_v1
+/v2: openstack_volume_api_v2
+/v3: openstack_volume_api_v3
+
+[composite:openstack_volume_api_v1]
+use = call:cinder.api.middleware.auth:pipeline_factory
+noauth = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler noauth apiv1
+keystone = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext  {% if volume.audit.enabled %}audit {% endif %}apiv1
+keystone_nolimit = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext  {% if volume.audit.enabled %}audit {% endif %}apiv1
+
+[composite:openstack_volume_api_v2]
+use = call:cinder.api.middleware.auth:pipeline_factory
+noauth = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler noauth apiv2
+keystone = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext apiv2
+keystone_nolimit = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext apiv2
+
+[composite:openstack_volume_api_v3]
+use = call:cinder.api.middleware.auth:pipeline_factory
+noauth = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler noauth apiv3
+keystone = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext apiv3
+keystone_nolimit = cors http_proxy_to_wsgi request_id faultwrap sizelimit osprofiler authtoken keystonecontext apiv3
+
+[filter:request_id]
+paste.filter_factory = oslo_middleware.request_id:RequestId.factory
+
+[filter:http_proxy_to_wsgi]
+paste.filter_factory = oslo_middleware.http_proxy_to_wsgi:HTTPProxyToWSGI.factory
+
+[filter:cors]
+paste.filter_factory = oslo_middleware.cors:filter_factory
+oslo_config_project = cinder
+
+[filter:faultwrap]
+paste.filter_factory = cinder.api.middleware.fault:FaultWrapper.factory
+
+[filter:osprofiler]
+paste.filter_factory = osprofiler.web:WsgiMiddleware.factory
+
+[filter:noauth]
+paste.filter_factory = cinder.api.middleware.auth:NoAuthMiddleware.factory
+
+[filter:sizelimit]
+paste.filter_factory = oslo_middleware.sizelimit:RequestBodySizeLimiter.factory
+
+[app:apiv1]
+paste.app_factory = cinder.api.v1.router:APIRouter.factory
+
+[app:apiv2]
+paste.app_factory = cinder.api.v2.router:APIRouter.factory
+
+[app:apiv3]
+paste.app_factory = cinder.api.v3.router:APIRouter.factory
+
+[pipeline:apiversions]
+pipeline = cors http_proxy_to_wsgi faultwrap osvolumeversionapp
+
+[app:osvolumeversionapp]
+paste.app_factory = cinder.api.versions:Versions.factory
+
+##########
+# Shared #
+##########
+
+[filter:keystonecontext]
+paste.filter_factory = cinder.api.middleware.auth:CinderKeystoneContext.factory
+
+[filter:authtoken]
+paste.filter_factory = keystonemiddleware.auth_token:filter_factory
+
+{%- if volume.audit.enabled %}
+[filter:audit]
+paste.filter_factory = {{ volume.get("audit", {}).get("filter_factory", "keystonemiddleware.audit:filter_factory")   }}
+audit_map_file = {{ volume.get("audit", {}).get("map_file", "/etc/pycadf/cinder_api_audit_map.conf")  }}
+{%- endif %}
diff --git a/cinder/files/ocata/api-paste.ini.volume.RedHat b/cinder/files/ocata/api-paste.ini.volume.RedHat
new file mode 120000
index 0000000..c5204ec
--- /dev/null
+++ b/cinder/files/ocata/api-paste.ini.volume.RedHat
@@ -0,0 +1 @@
+api-paste.ini.volume.Debian
\ No newline at end of file
diff --git a/cinder/files/ocata/cinder-wsgi.conf b/cinder/files/ocata/cinder-wsgi.conf
new file mode 100644
index 0000000..3e4de23
--- /dev/null
+++ b/cinder/files/ocata/cinder-wsgi.conf
@@ -0,0 +1,27 @@
+{%- from "cinder/map.jinja" import controller with context %}
+Listen {{ controller.osapi.host }}:8776
+LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\" %D(us)" cinder_combined
+
+<VirtualHost {{ controller.osapi.host }}:8776>
+    WSGIDaemonProcess cinder-wsgi processes=5 threads=1 user=cinder display-name=%{GROUP}
+    WSGIProcessGroup cinder-wsgi
+    WSGIScriptAlias / /usr/bin/cinder-wsgi
+    WSGIApplicationGroup %{GLOBAL}
+    WSGIPassAuthorization On
+    <IfVersion >= 2.4>
+      ErrorLogFormat "%{cu}t %M"
+    </IfVersion>
+
+    ErrorLog /var/log/apache2/cinder_error.log
+    CustomLog /var/log/apache2/cinder.log cinder_combined
+
+    <Directory /usr/bin>
+	<IfVersion >= 2.4>
+            Require all granted
+        </IfVersion>
+        <IfVersion < 2.4>
+            Order allow,deny
+            Allow from all
+        </IfVersion>
+    </Directory>
+</VirtualHost>
diff --git a/cinder/files/ocata/cinder.conf.controller.Debian b/cinder/files/ocata/cinder.conf.controller.Debian
new file mode 100644
index 0000000..550f3c3
--- /dev/null
+++ b/cinder/files/ocata/cinder.conf.controller.Debian
@@ -0,0 +1,172 @@
+{%- from "cinder/map.jinja" import controller with context %}
+
+[DEFAULT]
+rootwrap_config = /etc/cinder/rootwrap.conf
+api_paste_confg = /etc/cinder/api-paste.ini
+
+iscsi_helper = tgtadm
+volume_name_template = volume-%s
+#volume_group = cinder
+
+verbose = True
+
+osapi_volume_workers = {{ controller.get('volume_workers', '4') }}
+
+auth_strategy = keystone
+
+state_path = /var/lib/cinder
+
+use_syslog=False
+
+glance_num_retries=0
+debug=False
+
+os_region_name={{ controller.identity.region }}
+
+#glance_api_ssl_compression=False
+#glance_api_insecure=False
+
+osapi_volume_listen={{ controller.osapi.host }}
+
+glance_api_servers = http://{{ controller.glance.host }}:{{ controller.glance.port }}
+
+glance_host={{ controller.glance.host }}
+glance_port={{ controller.glance.port }}
+glance_api_version=2
+
+enable_v3_api = True
+
+os_privileged_user_name={{ controller.identity.user }}
+os_privileged_user_password={{ controller.identity.password }}
+os_privileged_user_tenant={{ controller.identity.tenant }}
+os_privileged_user_auth_url=http://{{ controller.identity.host }}:5000/v3/
+
+volume_backend_name=DEFAULT
+
+{%- if controller.backend is defined %}
+
+default_volume_type={{ controller.default_volume_type }}
+
+enabled_backends={% for backend_name, backend in controller.get('backend', {}).iteritems() %}{{ backend_name }}{% if not loop.last %},{% endif %}{% endfor %}
+
+{%- endif %}
+
+{%- if controller.storage_availability_zone is defined %}
+storage_availability_zone={{controller.storage_availability_zone}}
+{%- endif %}
+
+{%- if controller.default_availability_zone is defined %}
+default_availability_zone={{controller.default_availability_zone}}
+{%- endif %}
+
+
+#RPC response timeout recommended by Hitachi
+rpc_response_timeout=3600
+
+#Rabbit
+rpc_backend=rabbit
+control_exchange=cinder
+
+
+volume_clear={{ controller.wipe_method }}
+
+
+
+volume_name_template = volume-%s
+
+#volume_group = vg_cinder_volume
+
+volumes_dir = /var/lib/cinder/volumes
+log_dir=/var/log/cinder
+
+# Use syslog for logging. (boolean value)
+#use_syslog=false
+
+use_syslog=false
+verbose=True
+lock_path=/var/lock/cinder
+
+{%- if controller.query_volume_filters is defined %}
+query_volume_filters = {{ controller.query_volume_filters|join(",") }}
+{%- endif %}
+
+nova_catalog_admin_info = compute:nova:adminURL
+nova_catalog_info = compute:nova:{{ controller.identity.get('endpoint_type', 'publicURL') }}
+
+osapi_volume_extension = cinder.api.contrib.standard_extensions
+
+{%- if controller.message_queue.members is defined %}
+transport_url = rabbit://{% for member in controller.message_queue.members -%}
+                             {{ controller.message_queue.user }}:{{ controller.message_queue.password }}@{{ member.host }}:{{ member.get('port', 5672) }}
+                             {%- if not loop.last -%},{%- endif -%}
+                         {%- endfor -%}
+                             /{{ controller.message_queue.virtual_host }}
+{%- else %}
+transport_url = rabbit://{{ controller.message_queue.user }}:{{ controller.message_queue.password }}@{{ controller.message_queue.host }}:{{ controller.message_queue.port }}/{{ controller.message_queue.virtual_host }}
+{%- endif %}
+
+{%- if controller.backup.engine != None %}
+{%- set backup_backend_fragment = "cinder/files/backup_backend/_" + controller.backup.engine + ".conf" %}
+{%- include backup_backend_fragment %}
+{%- endif %}
+
+[oslo_messaging_notifications]
+{%- if controller.notification is mapping %}
+driver = {{ controller.notification.get('driver', 'messagingv2') }}
+{%- if controller.notification.topics is defined %}
+topics = {{ controller.notification.topics }}
+{%- endif %}
+{%- elif controller.notification %}
+driver = messagingv2
+{%- endif %}
+
+[oslo_concurrency]
+
+lock_path=/var/lock/cinder
+
+[oslo_middleware]
+
+enable_proxy_headers_parsing = True
+
+[oslo_messaging_rabbit]
+
+[keystone_authtoken]
+signing_dir=/tmp/keystone-signing-cinder
+revocation_cache_time = 10
+auth_type = password
+user_domain_name = {{ controller.identity.get('domain', 'Default') }}
+project_domain_name = {{ controller.identity.get('domain', 'Default') }}
+project_name = {{ controller.identity.tenant }}
+username = {{ controller.identity.user }}
+password = {{ controller.identity.password }}
+
+auth_uri=http://{{ controller.identity.host }}:5000
+auth_url=http://{{ controller.identity.host }}:35357
+# Temporary disabled for backward compataiblity
+#auth_uri=http://{{ controller.identity.host }}/identity
+#auth_url=http://{{ controller.identity.host }}/identity_v2_admin
+{%- if controller.cache is defined %}
+memcached_servers={%- for member in controller.cache.members %}{{ member.host }}:11211{% if not loop.last %},{% endif %}{%- endfor %}
+{%- endif %}
+auth_version = v3
+
+[barbican]
+auth_endpoint=http://{{ controller.identity.host }}:5000
+
+[database]
+idle_timeout=3600
+max_pool_size=30
+max_retries=-1
+max_overflow=40
+connection = {{ controller.database.engine }}+pymysql://{{ controller.database.user }}:{{ controller.database.password }}@{{ controller.database.host }}/{{ controller.database.name }}?charset=utf8
+
+{%- if controller.backend is defined %}
+
+{%- for backend_name, backend in controller.get('backend', {}).iteritems() %}
+
+{%- set backend_fragment = "cinder/files/backend/_" + backend.engine + ".conf" %}
+{%- include backend_fragment %}
+
+{%- endfor %}
+
+{%- endif %}
diff --git a/cinder/files/ocata/cinder.conf.controller.RedHat b/cinder/files/ocata/cinder.conf.controller.RedHat
new file mode 120000
index 0000000..563de88
--- /dev/null
+++ b/cinder/files/ocata/cinder.conf.controller.RedHat
@@ -0,0 +1 @@
+cinder.conf.controller.Debian
\ No newline at end of file
diff --git a/cinder/files/ocata/cinder.conf.volume.Debian b/cinder/files/ocata/cinder.conf.volume.Debian
new file mode 100644
index 0000000..1124056
--- /dev/null
+++ b/cinder/files/ocata/cinder.conf.volume.Debian
@@ -0,0 +1,162 @@
+{%- from "cinder/map.jinja" import volume with context %}
+
+[DEFAULT]
+rootwrap_config = /etc/cinder/rootwrap.conf
+api_paste_confg = /etc/cinder/api-paste.ini
+
+iscsi_helper = tgtadm
+volume_name_template = volume-%s
+#volume_group = cinder
+
+verbose = True
+
+osapi_volume_workers = {{ volume.get('volume_workers', '4') }}
+
+auth_strategy = keystone
+
+state_path = /var/lib/cinder
+
+use_syslog=False
+
+glance_num_retries=0
+debug=False
+
+os_region_name={{ volume.identity.region }}
+
+#glance_api_ssl_compression=False
+#glance_api_insecure=False
+
+osapi_volume_listen={{ volume.osapi.host }}
+
+glance_api_servers = http://{{ volume.glance.host }}:{{ volume.glance.port }}
+
+glance_host={{ volume.glance.host }}
+glance_port={{ volume.glance.port }}
+glance_api_version=2
+
+os_privileged_user_name={{ volume.identity.user }}
+os_privileged_user_password={{ volume.identity.password }}
+os_privileged_user_tenant={{ volume.identity.tenant }}
+os_privileged_user_auth_url=http://{{ volume.identity.host }}:5000/v3/
+
+volume_backend_name=DEFAULT
+
+{%- if volume.backend is defined %}
+
+default_volume_type={{ volume.default_volume_type }}
+
+enabled_backends={% for backend_name, backend in volume.get('backend', {}).iteritems() %}{{ backend_name }}{% if not loop.last %},{% endif %}{% endfor %}
+
+{%- endif %}
+
+{%- if volume.storage_availability_zone is defined %}
+storage_availability_zone={{volume.storage_availability_zone}}
+{%- endif %}
+
+{%- if volume.default_availability_zone is defined %}
+default_availability_zone={{volume.default_availability_zone}}
+{%- endif %}
+
+
+#RPC response timeout recommended by Hitachi
+rpc_response_timeout=3600
+
+#Rabbit
+rpc_backend=rabbit
+control_exchange=cinder
+
+
+volume_clear={{ volume.wipe_method }}
+
+
+volume_name_template = volume-%s
+
+#volume_group = vg_cinder_volume
+
+volumes_dir = /var/lib/cinder/volumes
+log_dir=/var/log/cinder
+
+# Use syslog for logging. (boolean value)
+#use_syslog=false
+
+use_syslog=false
+verbose=True
+
+nova_catalog_admin_info = compute:nova:adminURL
+nova_catalog_info = compute:nova:{{ volume.identity.get('endpoint_type', 'publicURL') }}
+
+{%- if volume.message_queue.members is defined %}
+transport_url = rabbit://{% for member in volume.message_queue.members -%}
+                             {{ volume.message_queue.user }}:{{ volume.message_queue.password }}@{{ member.host }}:{{ member.get('port', 5672) }}
+                             {%- if not loop.last -%},{%- endif -%}
+                         {%- endfor -%}
+                             /{{ volume.message_queue.virtual_host }}
+{%- else %}
+transport_url = rabbit://{{ volume.message_queue.user }}:{{ volume.message_queue.password }}@{{ volume.message_queue.host }}:{{ volume.message_queue.port }}/{{ volume.message_queue.virtual_host }}
+{%- endif %}
+
+{%- if volume.backup.engine != None %}
+{%- set backup_backend_fragment = "cinder/files/backup_backend/_" + volume.backup.engine + ".conf" %}
+{%- include backup_backend_fragment %}
+{%- endif %}
+
+[oslo_messaging_notifications]
+{%- if volume.notification is mapping %}
+driver = {{ volume.notification.get('driver', 'messagingv2') }}
+{%- if volume.notification.topics is defined %}
+topics = {{ volume.notification.topics }}
+{%- endif %}
+{%- elif volume.notification %}
+driver = messagingv2
+{%- endif %}
+
+[oslo_concurrency]
+
+lock_path=/var/lock/cinder
+
+[oslo_middleware]
+
+enable_proxy_headers_parsing = True
+
+[oslo_messaging_rabbit]
+
+[keystone_authtoken]
+signing_dir=/tmp/keystone-signing-cinder
+revocation_cache_time = 10
+auth_type = password
+user_domain_name = {{ volume.identity.get('domain', 'Default') }}
+project_domain_name = {{ volume.identity.get('domain', 'Default') }}
+project_name = {{ volume.identity.tenant }}
+username = {{ volume.identity.user }}
+password = {{ volume.identity.password }}
+
+auth_uri=http://{{ volume.identity.host }}:5000/v3
+auth_url=http://{{ volume.identity.host }}:35357/v3
+# Temporary disabled for backward compataiblity
+#auth_uri=http://{{ volume.identity.host }}/identity
+#auth_url=http://{{ volume.identity.host }}/identity_v2_admin
+{%- if volume.cache is defined %}
+memcached_servers={%- for member in volume.cache.members %}{{ member.host }}:11211{% if not loop.last %},{% endif %}{%- endfor %}
+{%- endif %}
+auth_version = v3
+
+[barbican]
+auth_endpoint=http://{{ controller.identity.host }}:5000
+
+[database]
+idle_timeout=3600
+max_pool_size=30
+max_retries=-1
+max_overflow=40
+connection = {{ volume.database.engine }}+pymysql://{{ volume.database.user }}:{{ volume.database.password }}@{{ volume.database.host }}/{{ volume.database.name }}?charset=utf8
+
+{%- if volume.backend is defined %}
+
+{%- for backend_name, backend in volume.get('backend', {}).iteritems() %}
+
+{%- set backend_fragment = "cinder/files/backend/_" + backend.engine + ".conf" %}
+{%- include backend_fragment %}
+
+{%- endfor %}
+
+{%- endif %}
diff --git a/cinder/files/ocata/cinder.conf.volume.RedHat b/cinder/files/ocata/cinder.conf.volume.RedHat
new file mode 120000
index 0000000..df997ca
--- /dev/null
+++ b/cinder/files/ocata/cinder.conf.volume.RedHat
@@ -0,0 +1 @@
+cinder.conf.volume.Debian
\ No newline at end of file
diff --git a/cinder/files/ocata/nfs_shares b/cinder/files/ocata/nfs_shares
new file mode 100644
index 0000000..9878dca
--- /dev/null
+++ b/cinder/files/ocata/nfs_shares
@@ -0,0 +1,3 @@
+{%- for nfs_server in backend.devices %}
+{{ nfs_server }}
+{%- endfor %}
\ No newline at end of file
diff --git a/cinder/map.jinja b/cinder/map.jinja
index e0323a5..bc2b4c5 100644
--- a/cinder/map.jinja
+++ b/cinder/map.jinja
@@ -2,11 +2,16 @@
 {% set controller = salt['grains.filter_by']({
     'Debian': {
         'pkgs': ['cinder-api', 'cinder-scheduler', 'lvm2', 'python-cinder', 'gettext-base', 'python-memcache', 'python-pycadf'],
-        'services': ['cinder-api', 'cinder-scheduler'],
+        'services': ['cinder-scheduler'],
         'wipe_method': 'none',
         'notification': False,
         'audit': {
           'enabled': false
+        },
+        'backup': {
+          'pkgs': ['cinder-backup'],
+          'services': ['cinder-backup'],
+          'engine': None
         }
     },
     'RedHat': {
@@ -16,7 +21,13 @@
         'notification': False,
         'audit': {
           'enabled': false
+        },
+        'backup': {
+          'pkgs': ['cinder-backup'],
+          'services': ['cinder-backup'],
+          'engine': None
         }
+
     },
 }, merge=pillar.cinder.get('controller', {})) %}
 
@@ -28,7 +39,13 @@
         'notification': False,
         'audit': {
           'enabled': false
+        },
+        'backup': {
+          'pkgs': ['cinder-backup'],
+          'services': ['cinder-backup'],
+          'engine': None
         }
+
     },
     'RedHat': {
         'pkgs': ['openstack-cinder', 'python-cinder', 'lvm2', 'sysfsutils', 'sg3_utils', 'device-mapper-multipath', 'device-mapper-multipath-libs', 'python-pycadf'],
@@ -37,6 +54,11 @@
         'notification': False,
         'audit': {
           'enabled': false
+        },
+        'backup': {
+          'pkgs': ['cinder-backup'],
+          'services': ['cinder-backup'],
+          'engine': None
         }
     },
 }, merge=pillar.cinder.get('volume', {})) %}
diff --git a/cinder/volume.sls b/cinder/volume.sls
index 20b5adf..b4bc0f8 100644
--- a/cinder/volume.sls
+++ b/cinder/volume.sls
@@ -15,8 +15,10 @@
   - group: cinder
   - require:
     - pkg: cinder_volume_packages
+  {%- if not grains.get('noservices', False) %}
   - require_in:
     - service: cinder_volume_services
+  {%- endif %}
 
 {%- if not pillar.cinder.get('controller', {}).get('enabled', False) %}
 
@@ -34,6 +36,22 @@
   - require:
     - pkg: cinder_volume_packages
 
+{%- if volume.backup.engine != None %}
+
+cinder_backup_packages:
+  pkg.installed:
+  - names: {{ volume.backup.pkgs }}
+
+cinder_backup_services:
+  service.running:
+  - names: {{ volume.backup.services }}
+  - enable: true
+  - watch:
+    - file: /etc/cinder/cinder.conf
+    - file: /etc/cinder/api-paste.ini
+
+{%- endif %}
+
 {%- endif %}
 
 {%- if not grains.get('noservices', False) %}
@@ -70,7 +88,9 @@
   - source: salt://cinder/files/iscsitarget
   - template: jinja
   - require:
-    - pkg: cinder_iscsi_packages
+    - pkg: cinder_iscsi_packages_{{ loop.index }}
+
+{%- if not grains.get('noservices', False) %}
 
 cinder_scsi_service:
   service.running:
@@ -83,6 +103,9 @@
 
 {%- endif %}
 
+
+{%- endif %}
+
 {%- if backend.engine == 'hitachi_vsp' %}
 
 {%- if grains.os_family == 'Debian' and volume.version == 'juno' %}
@@ -116,6 +139,7 @@
 cinder_driver_fujitsu_{{ loop.index }}:
   pkg.latest:
     - name: cinder-driver-fujitsu
+    - refresh: true
 
 /etc/cinder/cinder_fujitsu_eternus_dx_{{ backend_name }}.xml:
   file.managed:
@@ -154,6 +178,8 @@
   - require:
     - pkg: cinder_iscsi_packages
 
+{%- if not grains.get('noservices', False) %}
+
 cinder_scsi_service:
   service.running:
   - names:
@@ -165,6 +191,8 @@
 
 {%- endif %}
 
+{%- endif %}
+
 {%- if volume.storage.engine == 'hitachi_vsp' %}
 
 {%- if grains.os_family == 'Debian' and volume.version == 'juno' %}
diff --git a/metadata.yml b/metadata.yml
index af2198a..a16c24e 100644
--- a/metadata.yml
+++ b/metadata.yml
@@ -1,3 +1,3 @@
 name: "cinder"
 version: "2016.4.1"
-source: "https://github.com/openstack/salt-formula-cinder"
+source: "https://github.com/salt-formulas/salt-formula-cinder"
diff --git a/tests/pillar/ceph_single.sls b/tests/pillar/ceph_single.sls
index de5f2cc..79838a2 100644
--- a/tests/pillar/ceph_single.sls
+++ b/tests/pillar/ceph_single.sls
@@ -11,6 +11,35 @@
         user: cinder
         secret_uuid: password
         client_cinder_key: password
+    identity:
+      engine: keystone
+      host: 127.0.0.1
+      port: 35357
+      tenant: service
+      user: cinder
+      password: pwd
+      region: regionOne
+    osapi:
+      host: 127.0.0.1
+    osapi_max_limit: 500
+    glance:
+        host: 127.0.0.1
+        port: 9292
+    default_volume_type: 7k2SaS
+    message_queue:
+      engine: rabbitmq
+      host: 127.0.0.1
+      port: 5672
+      user: openstack
+      password: pwd
+      virtual_host: '/openstack'
+    database:
+      engine: mysql
+      host: 127.0.0.1
+      port: 3306
+      name: cinder
+      user: cinder
+      password: pwd
   volume:
     enabled: true
     version: liberty
@@ -22,4 +51,32 @@
         engine: ceph
         user: cinder
         secret_uuid: password
-        client_cinder_key: password
\ No newline at end of file
+        client_cinder_key: password
+    identity:
+      engine: keystone
+      host: 127.0.0.1
+      port: 35357
+      tenant: service
+      user: cinder
+      password: pwd
+      region: regionOne
+    osapi:
+        host: 127.0.0.1
+    glance:
+        host: 127.0.0.1
+        port: 9292
+    default_volume_type: 7k2SaS
+    message_queue:
+      engine: rabbitmq
+      host: 127.0.0.1
+      port: 5672
+      user: openstack
+      password: pwd
+      virtual_host: '/openstack'
+    database:
+      engine: mysql
+      host: 127.0.0.1
+      port: 3306
+      name: cinder
+      user: cinder
+      password: pwd
diff --git a/tests/pillar/control_cluster.sls b/tests/pillar/control_cluster.sls
index 9fcafb4..62bb44b 100644
--- a/tests/pillar/control_cluster.sls
+++ b/tests/pillar/control_cluster.sls
@@ -41,6 +41,12 @@
         port: 11211
       - host: 127.0.0.1
         port: 11211
+    storage:
+      engine: storwize
+      host: 192.168.0.1
+      port: 22
+      user: username
+      password: pass
 
     audit:
       filter_factory: 'keystonemiddleware.audit:filter_factory'
diff --git a/tests/pillar/control_single.sls b/tests/pillar/control_single.sls
index 73a7a2e..ef2136a 100644
--- a/tests/pillar/control_single.sls
+++ b/tests/pillar/control_single.sls
@@ -30,3 +30,9 @@
       user: openstack
       password: password
       virtual_host: '/openstack'
+    storage:
+        engine: storwize
+        host: 192.168.0.1
+        port: 22
+        user: username
+        password: pass
diff --git a/tests/pillar/eternus_single.sls b/tests/pillar/eternus_single.sls
deleted file mode 100644
index 52b722c..0000000
--- a/tests/pillar/eternus_single.sls
+++ /dev/null
@@ -1,49 +0,0 @@
-cinder:
-  volume:
-    enabled: true
-    version: liberty
-    backend:
-      10kThinPro:
-        type_name: 10kThinPro
-        engine: fujitsu
-        pool: 10kThinPro
-        host: 127.0.0.1
-        port: 5988
-        user: username
-        password: password
-        connection: FC
-        name: 10kThinPro
-      10k_SAS:
-        type_name: 10k_SAS
-        pool: SAS10K
-        engine: fujitsu
-        host: 127.0.0.1
-        port: 5988
-        user: username
-        password: password
-        connection: FC
-        name: 7k2RAID6
-  controller:
-    enabled: true
-    version: liberty
-    backend:
-      10kThinPro:
-        type_name: 10kThinPro
-        engine: fujitsu
-        pool: 10kThinPro
-        host: 127.0.0.1
-        port: 5988
-        user: username
-        password: password
-        connection: FC
-        name: 10kThinPro
-      10k_SAS:
-        type_name: 10k_SAS
-        pool: SAS10K
-        engine: fujitsu
-        host: 127.0.0.1
-        port: 5988
-        user: username
-        password: password
-        connection: FC
-        name: 7k2RAID6
\ No newline at end of file
diff --git a/tests/pillar/gpfs_single.sls b/tests/pillar/gpfs_single.sls
index 4bb04d7..f77608d 100644
--- a/tests/pillar/gpfs_single.sls
+++ b/tests/pillar/gpfs_single.sls
@@ -11,6 +11,34 @@
         type_name: GPFS-SILVER
         engine: gpfs
         mount_point: '/mnt/gpfs-openstack/cinder/silver'
+    identity:
+      engine: keystone
+      host: 127.0.0.1
+      port: 35357
+      tenant: service
+      user: cinder
+      password: pwd
+      region: regionOne
+    osapi:
+        host: 127.0.0.1
+    glance:
+        host: 127.0.0.1
+        port: 9292
+    default_volume_type: 7k2SaS
+    message_queue:
+      engine: rabbitmq
+      host: 127.0.0.1
+      port: 5672
+      user: openstack
+      password: pwd
+      virtual_host: '/openstack'
+    database:
+      engine: mysql
+      host: 127.0.0.1
+      port: 3306
+      name: cinder
+      user: cinder
+      password: pwd
   controller:
     enabled: true
     version: liberty
@@ -22,4 +50,33 @@
       GPFS-SILVER:
         type_name: GPFS-SILVER
         engine: gpfs
-        mount_point: '/mnt/gpfs-openstack/cinder/silver'
\ No newline at end of file
+        mount_point: '/mnt/gpfs-openstack/cinder/silver'
+    identity:
+      engine: keystone
+      host: 127.0.0.1
+      port: 35357
+      tenant: service
+      user: cinder
+      password: pwd
+      region: regionOne
+    osapi:
+      host: 127.0.0.1
+    osapi_max_limit: 500
+    glance:
+        host: 127.0.0.1
+        port: 9292
+    default_volume_type: 7k2SaS
+    message_queue:
+      engine: rabbitmq
+      host: 127.0.0.1
+      port: 5672
+      user: openstack
+      password: pwd
+      virtual_host: '/openstack'
+    database:
+      engine: mysql
+      host: 127.0.0.1
+      port: 3306
+      name: cinder
+      user: cinder
+      password: pwd
diff --git a/tests/pillar/hp3par_single.sls b/tests/pillar/hp3par_single.sls
index cb93ba1..774c934 100644
--- a/tests/pillar/hp3par_single.sls
+++ b/tests/pillar/hp3par_single.sls
@@ -5,6 +5,7 @@
     backend:
       hp3par_backend:
         type_name: hp3par
+        engine: hp3par
         backend: hp3par_backend
         user: admin
         password: password  
@@ -15,6 +16,35 @@
         sanpassword: password
         debug: True
         snapcpg: OpenStackSNAPCPG
+    identity:
+      engine: keystone
+      host: 127.0.0.1
+      port: 35357
+      tenant: service
+      user: cinder
+      password: pwd
+      region: regionOne
+    osapi:
+      host: 127.0.0.1
+    osapi_max_limit: 500
+    glance:
+        host: 127.0.0.1
+        port: 9292
+    default_volume_type: 7k2SaS
+    message_queue:
+      engine: rabbitmq
+      host: 127.0.0.1
+      port: 5672
+      user: openstack
+      password: pwd
+      virtual_host: '/openstack'
+    database:
+      engine: mysql
+      host: 127.0.0.1
+      port: 3306
+      name: cinder
+      user: cinder
+      password: pwd
   volume:
     enabled: true
     version: liberty
@@ -31,4 +61,32 @@
         sanpassword: password
         debug: True
         snapcpg: OpenStackSNAPCPG
-        engine: hp3par
\ No newline at end of file
+        engine: hp3par
+    identity:
+      engine: keystone
+      host: 127.0.0.1
+      port: 35357
+      tenant: service
+      user: cinder
+      password: pwd
+      region: regionOne
+    osapi:
+        host: 127.0.0.1
+    glance:
+        host: 127.0.0.1
+        port: 9292
+    default_volume_type: 7k2SaS
+    message_queue:
+      engine: rabbitmq
+      host: 127.0.0.1
+      port: 5672
+      user: openstack
+      password: pwd
+      virtual_host: '/openstack'
+    database:
+      engine: mysql
+      host: 127.0.0.1
+      port: 3306
+      name: cinder
+      user: cinder
+      password: pwd
diff --git a/tests/pillar/lefthand_single.sls b/tests/pillar/lefthand_single.sls
index 9a48eec..ffec435 100644
--- a/tests/pillar/lefthand_single.sls
+++ b/tests/pillar/lefthand_single.sls
@@ -11,6 +11,34 @@
         password: password
         clustername: cluster1
         iscsi_chap_enabled: false
+    identity:
+      engine: keystone
+      host: 127.0.0.1
+      port: 35357
+      tenant: service
+      user: cinder
+      password: pwd
+      region: regionOne
+    osapi:
+        host: 127.0.0.1
+    glance:
+        host: 127.0.0.1
+        port: 9292
+    default_volume_type: 7k2SaS
+    message_queue:
+      engine: rabbitmq
+      host: 127.0.0.1
+      port: 5672
+      user: openstack
+      password: pwd
+      virtual_host: '/openstack'
+    database:
+      engine: mysql
+      host: 127.0.0.1
+      port: 3306
+      name: cinder
+      user: cinder
+      password: pwd
   controller:
     enabled: true
     version: liberty
@@ -22,4 +50,33 @@
         username: username
         password: password
         clustername: cluster1
-        iscsi_chap_enabled: false
\ No newline at end of file
+        iscsi_chap_enabled: false
+    identity:
+      engine: keystone
+      host: 127.0.0.1
+      port: 35357
+      tenant: service
+      user: cinder
+      password: pwd
+      region: regionOne
+    osapi:
+      host: 127.0.0.1
+    osapi_max_limit: 500
+    glance:
+        host: 127.0.0.1
+        port: 9292
+    default_volume_type: 7k2SaS
+    message_queue:
+      engine: rabbitmq
+      host: 127.0.0.1
+      port: 5672
+      user: openstack
+      password: pwd
+      virtual_host: '/openstack'
+    database:
+      engine: mysql
+      host: 127.0.0.1
+      port: 3306
+      name: cinder
+      user: cinder
+      password: pwd
diff --git a/tests/pillar/nfs.sls b/tests/pillar/nfs.sls
new file mode 100644
index 0000000..c79b3c1
--- /dev/null
+++ b/tests/pillar/nfs.sls
@@ -0,0 +1,24 @@
+cinder:
+  controller:
+    enabled: true
+    version: liberty
+    default_volume_type: nfs-driver
+    backend:
+      nfs-driver:
+        engine: nfs
+        type_name: nfs-driver
+        volume_group: cinder-volume
+        path: /var/lib/cinder/nfs
+        devices:
+        - 172.16.10.110:/var/nfs/cinder
+        options: rw,sync
+  volume:
+    enabled: true
+    version: liberty
+    default_volume_type: nfs-driver
+    backend:
+      nfs-driver:
+        enabled: true
+        engine: nfs
+        type_name: nfs-driver
+        volume_group: cinder-volume
\ No newline at end of file
diff --git a/tests/pillar/solidfire_single.sls b/tests/pillar/solidfire_single.sls
index a75d6f4..4ce427d 100644
--- a/tests/pillar/solidfire_single.sls
+++ b/tests/pillar/solidfire_single.sls
@@ -11,6 +11,34 @@
         san_password: password
         clustername: cluster1
         sf_emulate_512: false
+    identity:
+      engine: keystone
+      host: 127.0.0.1
+      port: 35357
+      tenant: service
+      user: cinder
+      password: pwd
+      region: regionOne
+    osapi:
+        host: 127.0.0.1
+    glance:
+        host: 127.0.0.1
+        port: 9292
+    default_volume_type: 7k2SaS
+    message_queue:
+      engine: rabbitmq
+      host: 127.0.0.1
+      port: 5672
+      user: openstack
+      password: pwd
+      virtual_host: '/openstack'
+    database:
+      engine: mysql
+      host: 127.0.0.1
+      port: 3306
+      name: cinder
+      user: cinder
+      password: pwd
   controller:
     enabled: true
     version: liberty
@@ -22,4 +50,33 @@
         san_login: username
         san_password: password
         clustername: cluster1
-        sf_emulate_512: false
\ No newline at end of file
+        sf_emulate_512: false
+    identity:
+      engine: keystone
+      host: 127.0.0.1
+      port: 35357
+      tenant: service
+      user: cinder
+      password: pwd
+      region: regionOne
+    osapi:
+      host: 127.0.0.1
+    osapi_max_limit: 500
+    glance:
+        host: 127.0.0.1
+        port: 9292
+    default_volume_type: 7k2SaS
+    message_queue:
+      engine: rabbitmq
+      host: 127.0.0.1
+      port: 5672
+      user: openstack
+      password: pwd
+      virtual_host: '/openstack'
+    database:
+      engine: mysql
+      host: 127.0.0.1
+      port: 3306
+      name: cinder
+      user: cinder
+      password: pwd
diff --git a/tests/pillar/storwize_single.sls b/tests/pillar/storwize_single.sls
index 96c6b6f..01cd8b9 100644
--- a/tests/pillar/storwize_single.sls
+++ b/tests/pillar/storwize_single.sls
@@ -36,6 +36,34 @@
         multihost: true
         multipath: true
         pool: SAS15K
+    identity:
+      engine: keystone
+      host: 127.0.0.1
+      port: 35357
+      tenant: service
+      user: cinder
+      password: pwd
+      region: regionOne
+    osapi:
+        host: 127.0.0.1
+    glance:
+        host: 127.0.0.1
+        port: 9292
+    default_volume_type: 7k2SaS
+    message_queue:
+      engine: rabbitmq
+      host: 127.0.0.1
+      port: 5672
+      user: openstack
+      password: pwd
+      virtual_host: '/openstack'
+    database:
+      engine: mysql
+      host: 127.0.0.1
+      port: 3306
+      name: cinder
+      user: cinder
+      password: pwd
   controller:
     enabled: true
     version: liberty
@@ -72,4 +100,33 @@
         connection: FC
         multihost: true
         multipath: true
-        pool: SAS15K
\ No newline at end of file
+        pool: SAS15K
+    identity:
+      engine: keystone
+      host: 127.0.0.1
+      port: 35357
+      tenant: service
+      user: cinder
+      password: pwd
+      region: regionOne
+    osapi:
+      host: 127.0.0.1
+    osapi_max_limit: 500
+    glance:
+        host: 127.0.0.1
+        port: 9292
+    default_volume_type: 7k2SaS
+    message_queue:
+      engine: rabbitmq
+      host: 127.0.0.1
+      port: 5672
+      user: openstack
+      password: pwd
+      virtual_host: '/openstack'
+    database:
+      engine: mysql
+      host: 127.0.0.1
+      port: 3306
+      name: cinder
+      user: cinder
+      password: pwd
diff --git a/tests/pillar/volume_single.sls b/tests/pillar/volume_single.sls
index d8f7071..e86b45f 100644
--- a/tests/pillar/volume_single.sls
+++ b/tests/pillar/volume_single.sls
@@ -19,6 +19,7 @@
       user: cinder
       password: password
       endpoint_type: internalURL
+      region: regionOne
     glance:
       host: 127.0.0.1
       port: 9292
@@ -29,3 +30,9 @@
       user: openstack
       password: password
       virtual_host: '/openstack'
+    storage:
+      engine: storwize
+      host: 192.168.0.1
+      port: 22
+      user: username
+      password: pass
diff --git a/tests/pillar/vsp_single.sls b/tests/pillar/vsp_single.sls
index 13450b4..3258ab7 100644
--- a/tests/pillar/vsp_single.sls
+++ b/tests/pillar/vsp_single.sls
@@ -8,6 +8,42 @@
         backend: hus100_backend
         engine: hitachi_vsp
         connection: FC
+        storage_id: 1
+        pool_id: 10
+        thin_pool_id: 12
+        user: admin
+        password: password
+        target_ports: CL3-B
+        compute_target_ports: CL1-E,CL2-E,CL3-B,CL4-D
+    identity:
+      engine: keystone
+      host: 127.0.0.1
+      port: 35357
+      tenant: service
+      user: cinder
+      password: pwd
+      region: regionOne
+    osapi:
+      host: 127.0.0.1
+    osapi_max_limit: 500
+    glance:
+        host: 127.0.0.1
+        port: 9292
+    default_volume_type: 7k2SaS
+    message_queue:
+      engine: rabbitmq
+      host: 127.0.0.1
+      port: 5672
+      user: openstack
+      password: pwd
+      virtual_host: '/openstack'
+    database:
+      engine: mysql
+      host: 127.0.0.1
+      port: 3306
+      name: cinder
+      user: cinder
+      password: pwd
   volume:
     enabled: true
     version: liberty
@@ -16,4 +52,32 @@
         type_name: HUS100
         backend: hus100_backend
         engine: hitachi_vsp
-        connection: FC
\ No newline at end of file
+        connection: FC
+    identity:
+      engine: keystone
+      host: 127.0.0.1
+      port: 35357
+      tenant: service
+      user: cinder
+      password: pwd
+      region: regionOne
+    osapi:
+        host: 127.0.0.1
+    glance:
+        host: 127.0.0.1
+        port: 9292
+    default_volume_type: 7k2SaS
+    message_queue:
+      engine: rabbitmq
+      host: 127.0.0.1
+      port: 5672
+      user: openstack
+      password: pwd
+      virtual_host: '/openstack'
+    database:
+      engine: mysql
+      host: 127.0.0.1
+      port: 3306
+      name: cinder
+      user: cinder
+      password: pwd