Merge "Fix name from interface to os_interface in compute and controller conf for Ocata"
diff --git a/README.rst b/README.rst
index dd27877..252f845 100644
--- a/README.rst
+++ b/README.rst
@@ -118,6 +118,21 @@
       ....
 
 
+Enable CORS parameters
+
+.. code-block:: yaml
+
+    nova:
+      controller:
+        cors:
+          allowed_origin: https:localhost.local,http:localhost.local
+          expose_headers: X-Auth-Token,X-Openstack-Request-Id,X-Subject-Token
+          allow_methods: GET,PUT,POST,DELETE,PATCH
+          allow_headers: X-Auth-Token,X-Openstack-Request-Id,X-Subject-Token
+          allow_credentials: True
+          max_age: 86400
+
+
 Compute nodes
 -------------
 
diff --git a/metadata/service/control/single.yml b/metadata/service/control/single.yml
index b4add44..820c5ff 100644
--- a/metadata/service/control/single.yml
+++ b/metadata/service/control/single.yml
@@ -60,8 +60,9 @@
         host: ${_param:single_address}
         port: 9696
         mtu: 1500
+        tenant: service
       metadata:
-        password: metadataPass
+        password: ${_param:metadata_password}
       cache:
         engine: memcached
         members:
diff --git a/nova/controller.sls b/nova/controller.sls
index c212413..4bd7a9a 100644
--- a/nova/controller.sls
+++ b/nova/controller.sls
@@ -80,6 +80,9 @@
     {%- if controller.version == "ocata" %}
     - 'su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova'
     {%- endif %}
+    {%- if controller.version == "newton" or controller.version == "ocata" %}
+    - nova-manage db online_data_migrations
+    {%- endif %}
     - nova-manage db sync
   - require:
     - file: /etc/nova/nova.conf
diff --git a/nova/files/mitaka/nova-controller.conf.Debian b/nova/files/mitaka/nova-controller.conf.Debian
index 4554ca1..7c9b434 100644
--- a/nova/files/mitaka/nova-controller.conf.Debian
+++ b/nova/files/mitaka/nova-controller.conf.Debian
@@ -205,3 +205,49 @@
 
 [vnc]
 keymap = {{ controller.get('vnc_keymap', 'en-us') }}
+
+
+[cors]
+#
+# From oslo.middleware
+#
+
+# Indicate whether this resource may be shared with the domain received in the
+# requests "origin" header. (list value)
+#allowed_origin = <None>
+{% if controller.cors.allowed_origin is defined %}
+allowed_origin = {{ controller.cors.allowed_origin }}
+{% endif %}
+
+# Indicate that the actual request can include user credentials (boolean value)
+#allow_credentials = true
+{% if controller.cors.allow_credentials is defined %}
+allow_credentials = {{ controller.cors.allow_credentials }}
+{% endif %}
+
+# Indicate which headers are safe to expose to the API. Defaults to HTTP Simple
+# Headers. (list value)
+#expose_headers = X-Auth-Token,X-Openstack-Request-Id,X-Subject-Token
+{% if controller.cors.expose_headers is defined %}
+expose_headers = {{ controller.cors.expose_headers }}
+{% endif %}
+
+# Maximum cache age of CORS preflight requests. (integer value)
+#max_age = 3600
+{% if controller.cors.max_age is defined %}
+max_age = {{ controller.cors.max_age }}
+{% endif %}
+
+
+# Indicate which methods can be used during the actual request. (list value)
+#allow_methods = GET,PUT,POST,DELETE,PATCH
+{% if controller.cors.allow_methods is defined %}
+allow_methods = {{ controller.cors.allow_methods }}
+{% endif %}
+
+# Indicate which header field names may be used during the actual request.
+# (list value)
+#allow_headers = X-Auth-Token,X-Openstack-Request-Id,X-Subject-Token,X-Project-Id,X-Project-Name,X-Project-Domain-Id,X-Project-Domain-Name,X-Domain-Id,X-Domain-Name
+{% if controller.cors.allow_headers is defined %}
+allow_headers = {{ controller.cors.allow_headers }}
+{% endif %}
diff --git a/nova/files/newton/nova-controller.conf.Debian b/nova/files/newton/nova-controller.conf.Debian
index 159485f..dee5e52 100644
--- a/nova/files/newton/nova-controller.conf.Debian
+++ b/nova/files/newton/nova-controller.conf.Debian
@@ -81,7 +81,7 @@
                          {%- 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 }}
+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 %}
 
 rpc_backend=rabbit
@@ -216,3 +216,48 @@
 
 [wsgi]
 api_paste_config=/etc/nova/api-paste.ini
+
+[cors]
+#
+# From oslo.middleware
+#
+
+# Indicate whether this resource may be shared with the domain received in the
+# requests "origin" header. (list value)
+#allowed_origin = <None>
+{% if controller.cors.allowed_origin is defined %}
+allowed_origin = {{ controller.cors.allowed_origin }}
+{% endif %}
+
+# Indicate that the actual request can include user credentials (boolean value)
+#allow_credentials = true
+{% if controller.cors.allow_credentials is defined %}
+allow_credentials = {{ controller.cors.allow_credentials }}
+{% endif %}
+
+# Indicate which headers are safe to expose to the API. Defaults to HTTP Simple
+# Headers. (list value)
+#expose_headers = X-Auth-Token,X-Openstack-Request-Id,X-Subject-Token
+{% if controller.cors.expose_headers is defined %}
+expose_headers = {{ controller.cors.expose_headers }}
+{% endif %}
+
+# Maximum cache age of CORS preflight requests. (integer value)
+#max_age = 3600
+{% if controller.cors.max_age is defined %}
+max_age = {{ controller.cors.max_age }}
+{% endif %}
+
+
+# Indicate which methods can be used during the actual request. (list value)
+#allow_methods = GET,PUT,POST,DELETE,PATCH
+{% if controller.cors.allow_methods is defined %}
+allow_methods = {{ controller.cors.allow_methods }}
+{% endif %}
+
+# Indicate which header field names may be used during the actual request.
+# (list value)
+#allow_headers = X-Auth-Token,X-Openstack-Request-Id,X-Subject-Token,X-Project-Id,X-Project-Name,X-Project-Domain-Id,X-Project-Domain-Name,X-Domain-Id,X-Domain-Name
+{% if controller.cors.allow_headers is defined %}
+allow_headers = {{ controller.cors.allow_headers }}
+{% endif %}
diff --git a/nova/files/newton/nova-controller.conf.RedHat b/nova/files/newton/nova-controller.conf.RedHat
index c8382d7..6739f80 100644
--- a/nova/files/newton/nova-controller.conf.RedHat
+++ b/nova/files/newton/nova-controller.conf.RedHat
@@ -78,7 +78,7 @@
                          {%- 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 }}
+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 %}
 
 rpc_backend=rabbit
diff --git a/nova/files/ocata/nova-controller.conf.Debian b/nova/files/ocata/nova-controller.conf.Debian
index e6f2f4c..6777fa7 100644
--- a/nova/files/ocata/nova-controller.conf.Debian
+++ b/nova/files/ocata/nova-controller.conf.Debian
@@ -3042,7 +3042,7 @@
                          {%- 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 }}
+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 %}
 
 # DEPRECATED: The messaging driver to use, defaults to rabbit. Other drivers
@@ -4283,25 +4283,41 @@
 # requests "origin" header. Format: "<protocol>://<host>[:<port>]", no trailing
 # slash. Example: https://horizon.example.com (list value)
 #allowed_origin=<None>
+{% if controller.cors.allowed_origin is defined %}
+allowed_origin = {{ controller.cors.allowed_origin }}
+{% endif %}
 
 # Indicate that the actual request can include user credentials (boolean value)
 #allow_credentials=true
+{% if controller.cors.allow_credentials is defined %}
+allow_credentials = {{ controller.cors.allow_credentials }}
+{% endif %}
 
 # Indicate which headers are safe to expose to the API. Defaults to HTTP Simple
 # Headers. (list value)
 #expose_headers=X-Auth-Token,X-Openstack-Request-Id,X-Subject-Token,X-Service-Token
+{% if controller.cors.expose_headers is defined %}
+expose_headers = {{ controller.cors.expose_headers }}
+{% endif %}
 
 # Maximum cache age of CORS preflight requests. (integer value)
 #max_age=3600
-max_age=0
+{% if controller.cors.max_age is defined %}
+max_age = {{ controller.cors.max_age }}
+{% endif %}
 
 # Indicate which methods can be used during the actual request. (list value)
 #allow_methods=GET,PUT,POST,DELETE,PATCH
+{% if controller.cors.allow_methods is defined %}
+allow_methods = {{ controller.cors.allow_methods }}
+{% endif %}
 
 # Indicate which header field names may be used during the actual request. (list
 # value)
 #allow_headers=X-Auth-Token,X-Openstack-Request-Id,X-Identity-Status,X-Roles,X-Service-Catalog,X-User-Id,X-Tenant-Id
-
+{% if controller.cors.allow_headers is defined %}
+allow_headers = {{ controller.cors.allow_headers }}
+{% endif %}
 
 [cors.subdomain]
 
diff --git a/nova/map.jinja b/nova/map.jinja
index 81df0a8..4d56253 100644
--- a/nova/map.jinja
+++ b/nova/map.jinja
@@ -11,6 +11,7 @@
         'services': ['nova-api', 'nova-cert', 'nova-consoleauth', 'nova-scheduler', 'nova-conductor', 'nova-novncproxy'],
         'debug': false,
         'notification': false,
+        'cors': {},
         'audit': {
           'enabled': false
         },
@@ -20,6 +21,7 @@
         'services': ['openstack-nova-api', 'openstack-nova-cert', 'openstack-nova-consoleauth', 'openstack-nova-scheduler', 'openstack-nova-conductor', 'openstack-nova-novncproxy'],
         'debug': false,
         'notification': false,
+        'cors': {},
         'audit': {
           'enabled': false
         },