aboutsummaryrefslogtreecommitdiff
path: root/docker
diff options
context:
space:
mode:
Diffstat (limited to 'docker')
l---------[-rwxr-xr-x]docker/centos/binary/barbican/start.sh82
l---------docker/centos/binary/base/kolla-common.sh2
l---------docker/centos/binary/base/service_hosts.sh2
l---------[-rw-r--r--]docker/centos/binary/ceilometer/ceilometer-alarm/start.sh11
l---------[-rw-r--r--]docker/centos/binary/ceilometer/ceilometer-api/start.sh52
l---------[-rw-r--r--]docker/centos/binary/ceilometer/ceilometer-base/config-ceilometer.sh72
l---------[-rw-r--r--]docker/centos/binary/ceilometer/ceilometer-central/start.sh15
l---------[-rw-r--r--]docker/centos/binary/ceilometer/ceilometer-collector/start.sh10
l---------[-rw-r--r--]docker/centos/binary/ceilometer/ceilometer-compute/start.sh26
l---------[-rw-r--r--]docker/centos/binary/ceilometer/ceilometer-notification/start.sh10
l---------[-rwxr-xr-x]docker/centos/binary/cinder-app/cinder-api/check.sh17
l---------[-rwxr-xr-x]docker/centos/binary/cinder-app/cinder-api/start.sh74
l---------[-rwxr-xr-x]docker/centos/binary/cinder-app/cinder-backup/start.sh37
l---------[-rw-r--r--]docker/centos/binary/cinder-app/cinder-base/config-cinder.sh133
l---------[-rwxr-xr-x]docker/centos/binary/cinder-app/cinder-scheduler/start.sh33
l---------[-rwxr-xr-x]docker/centos/binary/cinder-app/cinder-volume/start.sh76
l---------[-rwxr-xr-x]docker/centos/binary/cinder-app/cinder-volume/volume-group-create.sh23
l---------[-rwxr-xr-x]docker/centos/binary/designate/designate-api/start.sh38
l---------[-rwxr-xr-x]docker/centos/binary/designate/designate-backend-bind9/start.sh61
l---------[-rwxr-xr-x]docker/centos/binary/designate/designate-base/config-designate.sh80
l---------[-rwxr-xr-x]docker/centos/binary/designate/designate-central/start.sh25
l---------[-rwxr-xr-x]docker/centos/binary/designate/designate-mdns/start.sh18
l---------[-rwxr-xr-x]docker/centos/binary/designate/designate-poolmanager/start.sh55
l---------[-rwxr-xr-x]docker/centos/binary/galera/config-galera.sh95
l---------[-rwxr-xr-x]docker/centos/binary/galera/start.sh15
l---------[-rwxr-xr-x]docker/centos/binary/glance/glance-api/check.sh18
l---------[-rwxr-xr-x]docker/centos/binary/glance/glance-api/start.sh53
l---------[-rw-r--r--]docker/centos/binary/glance/glance-base/config-glance.sh64
l---------[-rwxr-xr-x]docker/centos/binary/glance/glance-registry/start.sh22
l---------[-rw-r--r--]docker/centos/binary/hautoproxy/haproxy.cfg.tmpl27
l---------[-rwxr-xr-x]docker/centos/binary/hautoproxy/start.py66
l---------[-rwxr-xr-x]docker/centos/binary/heat/heat-api-cfn/check.sh17
l---------[-rwxr-xr-x]docker/centos/binary/heat/heat-api-cfn/start.sh29
l---------[-rwxr-xr-x]docker/centos/binary/heat/heat-api/check.sh17
l---------[-rwxr-xr-x]docker/centos/binary/heat/heat-api/start.sh30
l---------[-rwxr-xr-x]docker/centos/binary/heat/heat-base/config-heat.sh68
l---------[-rwxr-xr-x]docker/centos/binary/heat/heat-engine/start.sh18
l---------[-rwxr-xr-x]docker/centos/binary/horizon/start.sh37
l---------[-rwxr-xr-x]docker/centos/binary/keystone/check.sh13
l---------[-rwxr-xr-x]docker/centos/binary/keystone/start.sh163
l---------[-rwxr-xr-x]docker/centos/binary/magnum/magnum-api/check.sh17
l---------[-rwxr-xr-x]docker/centos/binary/magnum/magnum-api/start.sh28
l---------[-rwxr-xr-x]docker/centos/binary/magnum/magnum-base/config-magnum.sh47
l---------[-rwxr-xr-x]docker/centos/binary/magnum/magnum-conductor/start.sh18
l---------[-rwxr-xr-x]docker/centos/binary/mariadb-app/config-mysql.sh25
l---------[-rwxr-xr-x]docker/centos/binary/neutron/neutron-agents/check-scripts/check-dhcp-agent.sh14
l---------[-rwxr-xr-x]docker/centos/binary/neutron/neutron-agents/check-scripts/check-l3-agent.sh14
l---------[-rwxr-xr-x]docker/centos/binary/neutron/neutron-agents/check-scripts/check-linuxbridge-agent.sh14
l---------[-rwxr-xr-x]docker/centos/binary/neutron/neutron-agents/check-scripts/check-metadata-agent.sh14
l---------[-rwxr-xr-x]docker/centos/binary/neutron/neutron-agents/config-scripts/config-dhcp-agent.sh89
l---------[-rwxr-xr-x]docker/centos/binary/neutron/neutron-agents/config-scripts/config-l3-agent.sh86
l---------[-rwxr-xr-x]docker/centos/binary/neutron/neutron-agents/config-scripts/config-linuxbridge-agent.sh30
l---------[-rwxr-xr-x]docker/centos/binary/neutron/neutron-agents/config-scripts/config-metadata-agent.sh75
l---------[-rwxr-xr-x]docker/centos/binary/neutron/neutron-agents/config-scripts/config-sudoers.sh13
l---------[-rw-r--r--]docker/centos/binary/neutron/neutron-agents/fwaas_driver.ini4
l---------[-rw-r--r--]docker/centos/binary/neutron/neutron-agents/supervisord.conf54
l---------[-rw-r--r--]docker/centos/binary/neutron/neutron-base/config-neutron.sh211
l---------[-rwxr-xr-x]docker/centos/binary/neutron/neutron-server/check.sh18
l---------[-rwxr-xr-x]docker/centos/binary/neutron/neutron-server/start.sh99
l---------[-rwxr-xr-x]docker/centos/binary/nova-base/config-nova.sh138
l---------[-rwxr-xr-x]docker/centos/binary/nova-compute/nova-compute/config-nova-compute.sh29
l---------[-rwxr-xr-x]docker/centos/binary/nova-compute/nova-compute/start.sh11
l---------[-rwxr-xr-x]docker/centos/binary/nova-compute/nova-libvirt/start.sh23
l---------[-rwxr-xr-x]docker/centos/binary/nova-compute/nova-network/config-nova-network.sh31
l---------[-rwxr-xr-x]docker/centos/binary/nova-compute/nova-network/start.sh9
l---------[-rwxr-xr-x]docker/centos/binary/nova-controller/nova-api/check.sh18
l---------[-rwxr-xr-x]docker/centos/binary/nova-controller/nova-api/start.sh47
l---------[-rwxr-xr-x]docker/centos/binary/nova-controller/nova-conductor/start.sh24
l---------[-rwxr-xr-x]docker/centos/binary/nova-controller/nova-consoleauth/start.sh12
l---------[-rwxr-xr-x]docker/centos/binary/nova-controller/nova-novncproxy/start.sh23
l---------[-rwxr-xr-x]docker/centos/binary/nova-controller/nova-scheduler/start.sh16
l---------[-rw-r--r--]docker/centos/binary/rabbitmq/rabbitmq-env.conf3
l---------[-rw-r--r--]docker/centos/binary/rabbitmq/rabbitmq.config12
l---------[-rwxr-xr-x]docker/centos/binary/rabbitmq/start.sh25
l---------[-rw-r--r--]docker/centos/binary/swift/swift-account/start.sh35
l---------[-rw-r--r--]docker/centos/binary/swift/swift-container/start.sh35
l---------[-rw-r--r--]docker/centos/binary/swift/swift-object/start.sh35
l---------[-rw-r--r--]docker/centos/binary/swift/swift-proxy-server/start.sh6
l---------[-rwxr-xr-x]docker/centos/binary/zaqar/check.sh11
l---------[-rwxr-xr-x]docker/centos/binary/zaqar/start.sh65
-rwxr-xr-xdocker/common/barbican/start.sh81
-rw-r--r--docker/common/base/kolla-common.sh (renamed from docker/common/kolla-common.sh)0
-rwxr-xr-xdocker/common/base/service_hosts.sh (renamed from docker/common/service_hosts.sh)0
-rw-r--r--docker/common/ceilometer/ceilometer-alarm/start.sh10
-rw-r--r--docker/common/ceilometer/ceilometer-api/start.sh51
-rw-r--r--docker/common/ceilometer/ceilometer-base/config-ceilometer.sh71
-rw-r--r--docker/common/ceilometer/ceilometer-central/start.sh14
-rw-r--r--docker/common/ceilometer/ceilometer-collector/start.sh9
-rw-r--r--docker/common/ceilometer/ceilometer-compute/start.sh25
-rw-r--r--docker/common/ceilometer/ceilometer-notification/start.sh9
-rwxr-xr-xdocker/common/cinder-app/cinder-api/check.sh16
-rwxr-xr-xdocker/common/cinder-app/cinder-api/start.sh73
-rwxr-xr-xdocker/common/cinder-app/cinder-backup/start.sh36
-rw-r--r--docker/common/cinder-app/cinder-base/config-cinder.sh132
-rwxr-xr-xdocker/common/cinder-app/cinder-scheduler/start.sh32
-rwxr-xr-xdocker/common/cinder-app/cinder-volume/start.sh75
-rwxr-xr-xdocker/common/cinder-app/cinder-volume/volume-group-create.sh22
-rwxr-xr-xdocker/common/designate/designate-api/start.sh37
-rwxr-xr-xdocker/common/designate/designate-backend-bind9/start.sh60
-rwxr-xr-xdocker/common/designate/designate-base/config-designate.sh62
-rwxr-xr-xdocker/common/designate/designate-central/start.sh24
-rwxr-xr-xdocker/common/designate/designate-mdns/start.sh17
-rwxr-xr-xdocker/common/designate/designate-poolmanager/start.sh54
-rwxr-xr-xdocker/common/galera/config-galera.sh94
-rwxr-xr-xdocker/common/galera/start.sh14
-rwxr-xr-xdocker/common/glance/glance-api/check.sh17
-rwxr-xr-xdocker/common/glance/glance-api/start.sh52
-rw-r--r--docker/common/glance/glance-base/config-glance.sh63
-rwxr-xr-xdocker/common/glance/glance-registry/start.sh21
-rw-r--r--docker/common/hautoproxy/haproxy.cfg.tmpl26
-rwxr-xr-xdocker/common/hautoproxy/start.py65
-rwxr-xr-xdocker/common/heat/heat-api-cfn/check.sh16
-rwxr-xr-xdocker/common/heat/heat-api-cfn/start.sh28
-rwxr-xr-xdocker/common/heat/heat-api/check.sh16
-rwxr-xr-xdocker/common/heat/heat-api/start.sh29
-rwxr-xr-xdocker/common/heat/heat-base/config-heat.sh67
-rwxr-xr-xdocker/common/heat/heat-engine/start.sh17
-rwxr-xr-xdocker/common/horizon/start.sh36
-rwxr-xr-xdocker/common/keystone/check.sh12
-rwxr-xr-xdocker/common/keystone/start.sh162
-rwxr-xr-xdocker/common/magnum/magnum-api/check.sh16
-rwxr-xr-xdocker/common/magnum/magnum-api/start.sh27
-rwxr-xr-xdocker/common/magnum/magnum-base/config-magnum.sh46
-rwxr-xr-xdocker/common/magnum/magnum-conductor/start.sh17
-rwxr-xr-xdocker/common/mariadb-app/config-mysql.sh24
-rwxr-xr-xdocker/common/mariadb-app/mysql-entrypoint.sh (renamed from docker/centos/binary/mariadb-app/mysql-entrypoint.sh)2
-rwxr-xr-xdocker/common/neutron/neutron-agents/check-scripts/check-dhcp-agent.sh13
-rwxr-xr-xdocker/common/neutron/neutron-agents/check-scripts/check-l3-agent.sh13
-rwxr-xr-xdocker/common/neutron/neutron-agents/check-scripts/check-linuxbridge-agent.sh13
-rwxr-xr-xdocker/common/neutron/neutron-agents/check-scripts/check-metadata-agent.sh13
-rwxr-xr-xdocker/common/neutron/neutron-agents/config-scripts/config-dhcp-agent.sh88
-rwxr-xr-xdocker/common/neutron/neutron-agents/config-scripts/config-l3-agent.sh85
-rwxr-xr-xdocker/common/neutron/neutron-agents/config-scripts/config-linuxbridge-agent.sh29
-rwxr-xr-xdocker/common/neutron/neutron-agents/config-scripts/config-metadata-agent.sh74
-rwxr-xr-xdocker/common/neutron/neutron-agents/config-scripts/config-sudoers.sh12
-rw-r--r--docker/common/neutron/neutron-agents/fwaas_driver.ini3
-rw-r--r--docker/common/neutron/neutron-agents/supervisord.conf53
-rw-r--r--docker/common/neutron/neutron-base/config-neutron.sh210
-rwxr-xr-xdocker/common/neutron/neutron-server/check.sh17
-rwxr-xr-xdocker/common/neutron/neutron-server/start.sh98
-rwxr-xr-xdocker/common/nova-base/config-nova.sh137
-rwxr-xr-xdocker/common/nova-compute/nova-compute/config-nova-compute.sh28
-rwxr-xr-xdocker/common/nova-compute/nova-compute/start.sh10
-rwxr-xr-xdocker/common/nova-compute/nova-libvirt/start.sh22
-rwxr-xr-xdocker/common/nova-compute/nova-network/config-nova-network.sh30
-rwxr-xr-xdocker/common/nova-compute/nova-network/start.sh8
-rwxr-xr-xdocker/common/nova-controller/nova-api/check.sh17
-rwxr-xr-xdocker/common/nova-controller/nova-api/start.sh46
-rwxr-xr-xdocker/common/nova-controller/nova-conductor/start.sh23
-rwxr-xr-xdocker/common/nova-controller/nova-consoleauth/start.sh11
-rwxr-xr-xdocker/common/nova-controller/nova-novncproxy/start.sh22
-rwxr-xr-xdocker/common/nova-controller/nova-scheduler/start.sh15
-rw-r--r--docker/common/rabbitmq/rabbitmq-env.conf2
-rw-r--r--docker/common/rabbitmq/rabbitmq.config11
-rwxr-xr-xdocker/common/rabbitmq/start.sh24
-rw-r--r--docker/common/swift/swift-account/start.sh34
-rw-r--r--docker/common/swift/swift-container/start.sh34
-rw-r--r--docker/common/swift/swift-object/start.sh34
-rw-r--r--docker/common/swift/swift-proxy-server/start.sh5
-rwxr-xr-xdocker/common/zaqar/check.sh10
-rwxr-xr-xdocker/common/zaqar/start.sh64
l---------docker/fedora/binary/base/kolla-common.sh2
l---------docker/fedora/binary/base/service_hosts.sh2
l---------docker/rhel/binary/base/kolla-common.sh2
l---------docker/rhel/binary/base/service_hosts.sh2
165 files changed, 3168 insertions, 3107 deletions
diff --git a/docker/centos/binary/barbican/start.sh b/docker/centos/binary/barbican/start.sh
index 673aa4339..fbb47be02 100755..120000
--- a/docker/centos/binary/barbican/start.sh
+++ b/docker/centos/binary/barbican/start.sh
@@ -1,81 +1 @@
-#!/bin/bash
-
-set -e
-
-: ${BARBICAN_DB_USER:=barbican}
-: ${BARBICAN_DB_NAME:=barbican}
-: ${KEYSTONE_AUTH_PROTOCOL:=http}
-: ${BARBICAN_KEYSTONE_USER:=barbican}
-: ${ADMIN_TENANT_NAME:=admin}
-
-if ! [ "$BARBICAN_DB_PASSWORD" ]; then
- BARBICAN_DB_PASSWORD=$(openssl rand -hex 15)
- export BARBICAN_DB_PASSWORD
-fi
-
-check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
- KEYSTONE_ADMIN_SERVICE_PORT BARBICAN_ADMIN_PASSWORD
-fail_unless_db
-fail_unless_os_service_running keystone
-
-mysql -h ${MARIADB_SERVICE_HOST} -u root -p"${DB_ROOT_PASSWORD}" mysql <<EOF
-CREATE DATABASE IF NOT EXISTS ${BARBICAN_DB_NAME};
-GRANT ALL PRIVILEGES ON barbican.* TO
- '${BARBICAN_DB_USER}'@'%' IDENTIFIED BY '${BARBICAN_DB_PASSWORD}'
-EOF
-
-# config file setup
-crudini --set /etc/barbican/barbican-api.conf \
- DEFAULT \
- sql_connection \
- "mysql://${BARBICAN_DB_USER}:${BARBICAN_DB_PASSWORD}@${MARIADB_SERVICE_HOST}/${BARBICAN_DB_NAME}"
-crudini --set /etc/barbican/barbican-api.conf \
- DEFAULT \
- log_dir \
- "/var/log/barbican/"
-crudini --set /etc/barbican/barbican-api.conf \
- DEFAULT \
- log_file \
- "/var/log/barbican/barbican.log"
-crudini --set /etc/barbican/barbican-api-paste.ini \
- pipeline:barbican_api \
- pipeline \
- "keystone_authtoken context apiapp"
-crudini --set /etc/barbican/barbican-api-paste.ini \
- filter:keystone_authtoken \
- auth_host \
- ${KEYSTONE_ADMIN_SERVICE_HOST}
-crudini --set /etc/barbican/barbican-api-paste.ini \
- filter:keystone_authtoken \
- auth_port \
- ${KEYSTONE_ADMIN_SERVICE_PORT}
-crudini --set /etc/barbican/barbican-api-paste.ini \
- filter:keystone_authtoken \
- auth_protocol \
- ${KEYSTONE_AUTH_PROTOCOL}
-crudini --set /etc/barbican/barbican-api-paste.ini \
- filter:keystone_authtoken \
- admin_tenant_name \
- ${ADMIN_TENANT_NAME}
-crudini --set /etc/barbican/barbican-api-paste.ini \
- filter:keystone_authtoken \
- admin_user \
- ${BARBICAN_KEYSTONE_USER}
-crudini --set /etc/barbican/barbican-api-paste.ini \
- filter:keystone_authtoken \
- admin_password \
- ${BARBICAN_KEYSTONE_USER}
-
-# create the required keystone entities for barbican
-export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
-export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v2.0"
-
-keystone user-get ${BARBICAN_KEYSTONE_USER} > /dev/null 2>&1 || /bin/keystone user-create --name ${BARBICAN_KEYSTONE_USER} --pass ${BARBICAN_ADMIN_PASSWORD}
-
-keystone role-get observer > /dev/null 2>&1 || /bin/keystone role-create --name observer
-keystone role-get creator > /dev/null 2>&1 || /bin/keystone role-create --name creator
-
-keystone user-get ${BARBICAN_KEYSTONE_USER} > /dev/null 2>&1 || /bin/keystone user-role-add --user ${BARBICAN_KEYSTONE_USER} --role admin --tenant ${ADMIN_TENANT_NAME}
-
-# launch Barbican using uwsgi
-exec uwsgi --master --emperor /etc/barbican/vassals
+../../../common/barbican/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/base/kolla-common.sh b/docker/centos/binary/base/kolla-common.sh
index 380efbc3d..c265c62f7 120000
--- a/docker/centos/binary/base/kolla-common.sh
+++ b/docker/centos/binary/base/kolla-common.sh
@@ -1 +1 @@
-../../../common/kolla-common.sh \ No newline at end of file
+../../../common/base/kolla-common.sh \ No newline at end of file
diff --git a/docker/centos/binary/base/service_hosts.sh b/docker/centos/binary/base/service_hosts.sh
index 777b7334d..06e045440 120000
--- a/docker/centos/binary/base/service_hosts.sh
+++ b/docker/centos/binary/base/service_hosts.sh
@@ -1 +1 @@
-../../../common/service_hosts.sh \ No newline at end of file
+../../../common/base/service_hosts.sh \ No newline at end of file
diff --git a/docker/centos/binary/ceilometer/ceilometer-alarm/start.sh b/docker/centos/binary/ceilometer/ceilometer-alarm/start.sh
index 7470ae608..ed3ac528d 100644..120000
--- a/docker/centos/binary/ceilometer/ceilometer-alarm/start.sh
+++ b/docker/centos/binary/ceilometer/ceilometer-alarm/start.sh
@@ -1,10 +1 @@
-#!/bin/bash
-
-set -e
-
-. /opt/kolla/kolla-common.sh
-. /opt/kolla/config-ceilometer.sh
-
-
-exec /usr/bin/ceilometer-alarm-evaluator &
-exec /usr/bin/ceilometer-alarm-notifier
+../../../../common/ceilometer/ceilometer-alarm/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/ceilometer/ceilometer-api/start.sh b/docker/centos/binary/ceilometer/ceilometer-api/start.sh
index f081c9f84..7acfa2cba 100644..120000
--- a/docker/centos/binary/ceilometer/ceilometer-api/start.sh
+++ b/docker/centos/binary/ceilometer/ceilometer-api/start.sh
@@ -1,51 +1 @@
-#!/bin/bash
-
-set -e
-
-. /opt/kolla/kolla-common.sh
-. /opt/kolla/config-ceilometer.sh
-
-check_required_vars CEILOMETER_DB_USER CEILOMETER_DB_NAME \
- CEILOMETER_DB_PASSWORD KEYSTONE_ADMIN_TOKEN \
- KEYSTONE_AUTH_PROTOCOL KEYSTONE_ADMIN_SERVICE_HOST \
- KEYSTONE_ADMIN_SERVICE_PORT ADMIN_TENANT_NAME \
- CEILOMETER_KEYSTONE_USER CEILOMETER_ADMIN_PASSWORD \
- CEILOMETER_API_SERVICE_HOST PUBLIC_IP
-
-fail_unless_os_service_running keystone
-fail_unless_db
-
-#TODO(pkilambi): Add mongodb support
-
-mysql -h ${MARIADB_SERVICE_HOST} -u root -p${DB_ROOT_PASSWORD} mysql <<EOF
-CREATE DATABASE IF NOT EXISTS ${CEILOMETER_DB_NAME} DEFAULT CHARACTER SET utf8;
-GRANT ALL PRIVILEGES ON ${CEILOMETER_DB_NAME}.* TO
- '${CEILOMETER_DB_USER}'@'%' IDENTIFIED BY '${CEILOMETER_DB_PASSWORD}'
-
-EOF
-
-
-export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
-export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v2.0"
-
-
-crux user-create -n ${CEILOMETER_KEYSTONE_USER} \
- -p ${CEILOMETER_ADMIN_PASSWORD} \
- -t ${ADMIN_TENANT_NAME} \
- -r admin
-
-crux service-create -n ${CEILOMETER_KEYSTONE_USER} -t metering \
- -d "Ceilometer Telemetry Service"
-
-crux endpoint-create i--remove-all -n ${CEILOMETER_KEYSTONE_USER} -t metering \
- -I "${KEYSTONE_AUTH_PROTOCOL}://${CEILOMETER_API_SERVICE_HOST}:8777" \
- -P "${KEYSTONE_AUTH_PROTOCOL}://${PUBLIC_IP}:8777" \
- -A "${KEYSTONE_AUTH_PROTOCOL}://${CEILOMETER_API_SERVICE_HOST}:8777"
-
-cfg=/etc/ceilometer/ceilometer.conf
-crudini --set $cfg \
- DEFAULT connection
- "mysql://${CEILOMETER_DB_USER}:${CEILOMETER_DB_PASSWORD}@${MARIADB_SERVICE_HOST}/${CEILOMETER_DB_NAME}"
-
-
-exec /usr/bin/ceilometer-api
+../../../../common/ceilometer/ceilometer-api/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/ceilometer/ceilometer-base/config-ceilometer.sh b/docker/centos/binary/ceilometer/ceilometer-base/config-ceilometer.sh
index a2316dcd1..63215435d 100644..120000
--- a/docker/centos/binary/ceilometer/ceilometer-base/config-ceilometer.sh
+++ b/docker/centos/binary/ceilometer/ceilometer-base/config-ceilometer.sh
@@ -1,71 +1 @@
-#!/bin/bash
-
-set -e
-. /opt/kolla/kolla-common.sh
-
-: ${CEILOMETER_DB_USER:=ceilometer}
-: ${CEILOMETER_DB_NAME:=ceilometer}
-: ${KEYSTONE_AUTH_PROTOCOL:=http}
-: ${CEILOMETER_KEYSTONE_USER:=admin}
-: ${CEILOMETER_ADMIN_PASSWORD:=kolla}
-: ${ADMIN_TENANT_NAME:=admin}
-: ${METERING_SECRET:=ceilometer}
-: ${RABBIT_PASSWORD:=guest}
-
-check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
- KEYSTONE_ADMIN_SERVICE_PORT KEYSTONE_PUBLIC_SERVICE_HOST \
-dump_vars
-
-cat > /openrc <<EOF
-export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
-export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v2.0"
-EOF
-
-
-cfg=/etc/ceilometer/ceilometer.conf
-
-crudini --set $cfg \
- DEFAULT rpc_backend rabbit
-crudini --set $cfg \
- DEFAULT rabbit_host ${RABBITMQ_SERVICE_HOST}
-crudini --set $cfg \
- DEFAULT rabbit_password ${RABBIT_PASSWORD}
-
-crudini --set $cfg \
- keystone_authtoken \
- auth_uri \
- "http://${KEYSTONE_PUBLIC_SERVICE_HOST}:5000/"
-crudini --set $cfg \
- keystone_authtoken \
- admin_tenant_name \
- "${ADMIN_TENANT_NAME}"
-crudini --set $cfg \
- keystone_authtoken \
- admin_user \
- "${CEILOMETER_KEYSTONE_USER}"
-crudini --set $cfg \
- keystone_authtoken \
- admin_password \
- ${CEILOMETER_ADMIN_PASSWORD}
-
-crudini --set $cfg \
- service_credentials \
- os_auth_url \
- ${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_PUBLIC_SERVICE_HOST}:5000/
-crudini --set $cfg \
- service_credentials \
- os_username \
- ceilometer
-crudini --set $cfg \
- service_credentials \
- os_tenant_name \
- service
-crudini --set $cfg \
- service_credentials \
- os_password \
- ${CEILOMETER_ADMIN_PASSWORD}
-
-crudini --set $cfg \
- publisher
- metering_secret
- ${METERING_SECRET}
+../../../../common/ceilometer/ceilometer-base/config-ceilometer.sh \ No newline at end of file
diff --git a/docker/centos/binary/ceilometer/ceilometer-central/start.sh b/docker/centos/binary/ceilometer/ceilometer-central/start.sh
index 76f9a1fc2..8df383cd1 100644..120000
--- a/docker/centos/binary/ceilometer/ceilometer-central/start.sh
+++ b/docker/centos/binary/ceilometer/ceilometer-central/start.sh
@@ -1,14 +1 @@
-#!/bin/bash
-
-. /opt/kolla/kolla-common.sh
-. /opt/kolla/config-ceilometer.sh
-
-check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_AUTH_PROTOCOL \
- KEYSTONE_ADMIN_SERVICE_HOST KEYSTONE_ADMIN_SERVICE_PORT
-
-fail_unless_os_service_running keystone
-
-export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
-export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v2.0"
-
-exec /usr/bin/ceilometer-agent-central
+../../../../common/ceilometer/ceilometer-central/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/ceilometer/ceilometer-collector/start.sh b/docker/centos/binary/ceilometer/ceilometer-collector/start.sh
index 1ed4c9e7d..bea2eb09c 100644..120000
--- a/docker/centos/binary/ceilometer/ceilometer-collector/start.sh
+++ b/docker/centos/binary/ceilometer/ceilometer-collector/start.sh
@@ -1,9 +1 @@
-#!/bin/bash
-
-set -e
-
-. /opt/kolla/kolla-common.sh
-. /opt/kolla/config-ceilometer.sh
-
-
-exec /usr/bin/ceilometer-collector
+../../../../common/ceilometer/ceilometer-collector/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/ceilometer/ceilometer-compute/start.sh b/docker/centos/binary/ceilometer/ceilometer-compute/start.sh
index f4fc30bae..1118b9552 100644..120000
--- a/docker/centos/binary/ceilometer/ceilometer-compute/start.sh
+++ b/docker/centos/binary/ceilometer/ceilometer-compute/start.sh
@@ -1,25 +1 @@
-#!/bin/bash
-
-. /opt/kolla/kolla-common.sh
-. /opt/kolla/config-ceilometer.sh
-
-
-check_required_vars KEYSTONE_ADMIN_TOKEN RABBITMQ_SERVICE_HOST RABBIT_PASSWORD
-
-fail_unless_os_service_running keystone
-
-# Nova conf settings
-crudini --set /etc/nova/nova.conf DEFAULT instance_usage_audit True
-crudini --set /etc/nova/nova.conf DEFAULT instance_usage_audit_period hour
-crudini --set /etc/nova/nova.conf DEFAULT notify_on_state_change vm_and_task_state
-crudini --set /etc/nova/nova.conf DEFAULT notification_driver nova.openstack.common.notifier.rpc_notifier
-crudini --set /etc/nova/nova.conf DEFAULT notification_driver ceilometer.compute.nova_notifier
-
-#ceilometer settings
-cfg=/etc/ceilometer/ceilometer.conf
-crudini --set $cfg publisher_rpc metering_secret ${KEYSTONE_ADMIN_TOKEN}
-crudini --set $cfg rabbit_host ${RABBITMQ_SERVICE_HOST}
-crudini --set $cfg rabbit_password ${RABBIT_PASSWORD}
-
-
-exec /usr/bin/ceilometer-agent-compute
+../../../../common/ceilometer/ceilometer-compute/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/ceilometer/ceilometer-notification/start.sh b/docker/centos/binary/ceilometer/ceilometer-notification/start.sh
index 939734549..8e6d4e337 100644..120000
--- a/docker/centos/binary/ceilometer/ceilometer-notification/start.sh
+++ b/docker/centos/binary/ceilometer/ceilometer-notification/start.sh
@@ -1,9 +1 @@
-#!/bin/bash
-
-set -e
-
-. /opt/kolla/kolla-common.sh
-. /opt/kolla/config-ceilometer.sh
-
-
-exec /usr/bin/ceilometer-agent-notification
+../../../../common/ceilometer/ceilometer-notification/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/cinder-app/cinder-api/check.sh b/docker/centos/binary/cinder-app/cinder-api/check.sh
index 57b88f566..829110b45 100755..120000
--- a/docker/centos/binary/cinder-app/cinder-api/check.sh
+++ b/docker/centos/binary/cinder-app/cinder-api/check.sh
@@ -1,16 +1 @@
-#!/bin/sh
-
-RES=0
-
-. /openrc
-if ! keystone token-get > /dev/null; then
- echo "ERROR: keystone token-get failed" >&2
- RES=1
-else
- if ! cinder list > /dev/null; then
- echo "ERROR: cinder list failed" >&2
- RES=1
- fi
-fi
-
-exit $RES
+../../../../common/cinder-app/cinder-api/check.sh \ No newline at end of file
diff --git a/docker/centos/binary/cinder-app/cinder-api/start.sh b/docker/centos/binary/cinder-app/cinder-api/start.sh
index 28293ac6c..33182c78c 100755..120000
--- a/docker/centos/binary/cinder-app/cinder-api/start.sh
+++ b/docker/centos/binary/cinder-app/cinder-api/start.sh
@@ -1,73 +1 @@
-#!/bin/bash
-
-set -e
-
-. /opt/kolla/kolla-common.sh
-. /opt/kolla/config-cinder.sh
-
-check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
- ADMIN_TENANT_NAME PUBLIC_IP CINDER_API_SERVICE_HOST \
- KEYSTONE_AUTH_PROTOCOL KEYSTONE_ADMIN_SERVICE_PORT \
- CINDER_KEYSTONE_USER CINDER_KEYSTONE_PASSWORD \
- CINDER_API_LOG_FILE CINDER_API_SERVICE_LISTEN \
- CINDER_API_SERVICE_PORT CINDER_API_SERVICE_LISTEN
-
-fail_unless_os_service_running keystone
-
-cfg=/etc/cinder/cinder.conf
-
-# Set the auth credentials
-export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
-export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v2.0"
-
-# Create Keystone User
-crux user-create --update \
- -n "${CINDER_KEYSTONE_USER}" \
- -p "${CINDER_KEYSTONE_PASSWORD}" \
- -t "${ADMIN_TENANT_NAME}" \
- -r admin
-
-# Configure Keystone
-crux endpoint-create --remove-all \
- -n cinder \
- -t volume \
- -P "http://${CINDER_API_SERVICE_HOST}:${CINDER_API_SERVICE_PORT}/v1/\$(tenant_id)s" \
- -A "http://${CINDER_API_SERVICE_HOST}:${CINDER_API_SERVICE_PORT}/v1/\$(tenant_id)s" \
- -I "http://${CINDER_API_SERVICE_HOST}:${CINDER_API_SERVICE_PORT}/v1/\$(tenant_id)s"
-
-crux endpoint-create --remove-all \
- -n cinderv2 \
- -t volumev2 \
- -P "http://${CINDER_API_SERVICE_HOST}:${CINDER_API_SERVICE_PORT}/v2/\$(tenant_id)s" \
- -A "http://${CINDER_API_SERVICE_HOST}:${CINDER_API_SERVICE_PORT}/v2/\$(tenant_id)s" \
- -I "http://${CINDER_API_SERVICE_HOST}:${CINDER_API_SERVICE_PORT}/v2/\$(tenant_id)s"
-
-# Logging
-crudini --set $cfg \
- DEFAULT \
- log_file \
- "${CINDER_API_LOG_FILE}"
-
-# API Configuration
-crudini --set $cfg \
- DEFAULT \
- osapi_volume_listen \
- "${CINDER_API_SERVICE_LISTEN}"
-
-crudini --set $cfg \
- DEFAULT \
- osapi_volume_listen_port \
- "${CINDER_API_SERVICE_PORT}"
-
-crudini --set $cfg \
- DEFAULT \
- enable_v1_api \
- "true"
-
-crudini --set $cfg \
- DEFAULT \
- enable_v2_api \
- "true"
-
-echo "Starting cinder-api"
-exec /usr/bin/cinder-api --config-file $cfg
+../../../../common/cinder-app/cinder-api/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/cinder-app/cinder-backup/start.sh b/docker/centos/binary/cinder-app/cinder-backup/start.sh
index 5dff79b35..c21a17f09 100755..120000
--- a/docker/centos/binary/cinder-app/cinder-backup/start.sh
+++ b/docker/centos/binary/cinder-app/cinder-backup/start.sh
@@ -1,36 +1 @@
-#!/bin/bash
-
-set -e
-
-. /opt/kolla/kolla-common.sh
-. /opt/kolla/config-cinder.sh
-
-check_required_vars CINDER_BACKUP_DRIVER CINDER_BACKUP_MANAGER \
- CINDER_BACKUP_API_CLASS CINDER_BACKUP_NAME_TEMPLATE
-
-cfg=/etc/cinder/cinder.conf
-
-# volume backup configuration
-crudini --set $cfg \
- DEFAULT \
- backup_driver \
- "${CINDER_BACKUP_DRIVER}"
-crudini --set $cfg \
- DEFAULT \
- backup_topic \
- "cinder-backup"
-crudini --set $cfg \
- DEFAULT \
- backup_manager \
- "${CINDER_BACKUP_MANAGER}"
-crudini --set $cfg \
- DEFAULT \
- backup_api_class \
- "${CINDER_BACKUP_API_CLASS}"
-crudini --set $cfg \
- DEFAULT \
- backup_name_template \
- "${CINDER_BACKUP_NAME_TEMPLATE}"
-
-echo "Starting cinder-backup"
-exec /usr/bin/cinder-backup --config-file $cfg
+../../../../common/cinder-app/cinder-backup/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/cinder-app/cinder-base/config-cinder.sh b/docker/centos/binary/cinder-app/cinder-base/config-cinder.sh
index f82cb5510..22722c185 100644..120000
--- a/docker/centos/binary/cinder-app/cinder-base/config-cinder.sh
+++ b/docker/centos/binary/cinder-app/cinder-base/config-cinder.sh
@@ -1,132 +1 @@
-#!/bin/sh
-
-set -e
-
-. /opt/kolla/kolla-common.sh
-
-check_required_vars CINDER_DB_PASSWORD CINDER_KEYSTONE_PASSWORD \
- KEYSTONE_PUBLIC_SERVICE_HOST RABBITMQ_SERVICE_HOST \
- GLANCE_API_SERVICE_HOST MARIADB_SERVICE_HOST \
- RABBITMQ_SERVICE_HOST RABBITMQ_SERVICE_PORT \
- RABBIT_USERID RABBIT_PASSWORD GLANCE_API_SERVICE_HOST \
- GLANCE_API_SERVICE_PORT ADMIN_TENANT_NAME \
- CINDER_DB_NAME CINDER_DB_USER CINDER_KEYSTONE_USER \
- PUBLIC_IP KEYSTONE_AUTH_PROTOCOL CINDER_LOG_DIR
-
-dump_vars
-
-cat > /openrc <<EOF
-export OS_AUTH_URL="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_PUBLIC_SERVICE_HOST}:${KEYSTONE_PUBLIC_SERVICE_PORT}/v2.0"
-export OS_USERNAME="${CINDER_KEYSTONE_USER}"
-export OS_PASSWORD="${CINDER_KEYSTONE_PASSWORD}"
-export OS_TENANT_NAME="${ADMIN_TENANT_NAME}"
-EOF
-
-cfg=/etc/cinder/cinder.conf
-
-# Logging
-crudini --set $cfg \
- DEFAULT \
- log_dir \
- "${CINDER_LOG_DIR}"
-crudini --set $cfg \
- DEFAULT \
- verbose \
- "${VERBOSE_LOGGING}"
-crudini --set $cfg \
- DEFAULT \
- debug \
- "${DEBUG_LOGGING}"
-
-# backend
-crudini --set $cfg \
- DEFAULT \
- rpc_backend \
- "cinder.openstack.common.rpc.impl_kombu"
-
-# rabbit
-crudini --set $cfg \
- DEFAULT \
- rabbit_host \
- "${RABBITMQ_SERVICE_HOST}"
-crudini --set $cfg \
- DEFAULT \
- rabbit_port \
- "${RABBITMQ_SERVICE_PORT}"
-crudini --set $cfg \
- DEFAULT \
- rabbit_hosts \
- "${RABBITMQ_SERVICE_HOST}:${RABBITMQ_SERVICE_PORT}"
-crudini --set $cfg \
- DEFAULT \
- rabbit_userid \
- "${RABBIT_USERID}"
-crudini --set $cfg \
- DEFAULT \
- rabbit_password \
- "${RABBIT_PASSWORD}"
-crudini --set /etc/cinder/cinder.conf \
- DEFAULT \
- rabbit_virtual_host \
- "/"
-crudini --set /etc/cinder/cinder.conf \
- DEFAULT \
- rabbit_ha_queues \
- "False"
-
-# control_exchange
-crudini --set /etc/cinder/cinder.conf \
- DEFAULT \
- control_exchange \
- "openstack"
-
-# glance
-crudini --set $cfg \
- DEFAULT \
- glance_host \
- "${GLANCE_API_SERVICE_HOST}"
-crudini --set $cfg \
- DEFAULT \
- glance_port \
- "${GLANCE_API_SERVICE_PORT}"
-
-# database
-crudini --set $cfg \
- database \
- connection \
- "mysql://${CINDER_DB_USER}:${CINDER_DB_PASSWORD}@${MARIADB_SERVICE_HOST}/${CINDER_DB_NAME}"
-
-# keystone
-crudini --set $cfg \
- DEFAULT \
- auth_strategy \
- "keystone"
-crudini --del $cfg \
- keystone_authtoken \
- auth_protocol
-crudini --del $cfg \
- keystone_authtoken \
- auth_host
-crudini --del $cfg \
- keystone_authtoken \
- auth_port
-crudini --set $cfg \
- keystone_authtoken \
- auth_uri \
- "${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_PUBLIC_SERVICE_HOST}:${KEYSTONE_PUBLIC_SERVICE_PORT}/v2.0"
-crudini --set $cfg \
- keystone_authtoken \
- identity_uri \
- "${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}"
-crudini --set $cfg \
- keystone_authtoken \
- admin_tenant_name \
- "${ADMIN_TENANT_NAME}"
-crudini --set $cfg \
- keystone_authtoken \
- admin_user \
- "${CINDER_KEYSTONE_USER}"
-crudini --set $cfg \
- keystone_authtoken \
- admin_password \
- "${CINDER_KEYSTONE_PASSWORD}"
+../../../../common/cinder-app/cinder-base/config-cinder.sh \ No newline at end of file
diff --git a/docker/centos/binary/cinder-app/cinder-scheduler/start.sh b/docker/centos/binary/cinder-app/cinder-scheduler/start.sh
index 93efeb406..a91c95ebd 100755..120000
--- a/docker/centos/binary/cinder-app/cinder-scheduler/start.sh
+++ b/docker/centos/binary/cinder-app/cinder-scheduler/start.sh
@@ -1,32 +1 @@
-#!/bin/bash
-
-set -e
-
-. /opt/kolla/kolla-common.sh
-. /opt/kolla/config-cinder.sh
-
-fail_unless_db
-
-check_required_vars MARIADB_SERVICE_HOST DB_ROOT_PASSWORD \
- CINDER_DB_NAME CINDER_DB_USER CINDER_DB_PASSWORD \
- CINDER_SCHEDULER_LOG_FILE INIT_CINDER_DB
-
-cfg=/etc/cinder/cinder.conf
-
-if [ "${INIT_CINDER_DB}" == "true" ]; then
- mysql -h ${MARIADB_SERVICE_HOST} -u root -p${DB_ROOT_PASSWORD} mysql <<EOF
-CREATE DATABASE IF NOT EXISTS ${CINDER_DB_NAME};
-GRANT ALL PRIVILEGES ON ${CINDER_DB_NAME}.* TO
-'${CINDER_DB_USER}'@'%' IDENTIFIED BY '${CINDER_DB_PASSWORD}'
-EOF
-
- su -s /bin/sh -c "cinder-manage db sync" cinder
-fi
-
-crudini --set $cfg \
- DEFAULT \
- log_file \
- "${CINDER_SCHEDULER_LOG_FILE}"
-
-echo "Starting cinder-scheduler"
-exec /usr/bin/cinder-scheduler --config-file $cfg
+../../../../common/cinder-app/cinder-scheduler/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/cinder-app/cinder-volume/start.sh b/docker/centos/binary/cinder-app/cinder-volume/start.sh
index db29e75de..f79df7c47 100755..120000
--- a/docker/centos/binary/cinder-app/cinder-volume/start.sh
+++ b/docker/centos/binary/cinder-app/cinder-volume/start.sh
@@ -1,75 +1 @@
-#!/bin/bash
-
-set -e
-
-. /opt/kolla/kolla-common.sh
-. /opt/kolla/config-cinder.sh
-. /opt/kolla/volume-group-create.sh
-
-check_required_vars CINDER_VOLUME_API_LISTEN ISCSI_HELPER ISCSI_IP_ADDRESS \
- CINDER_VOLUME_GROUP CINDER_LVM_LO_VOLUME_SIZE \
- CINDER_VOLUME_BACKEND_NAME CINDER_VOLUME_DRIVER \
- CINDER_ENABLED_BACKEND CINDER_VOLUME_LOG_FILE
-
-cfg=/etc/cinder/cinder.conf
-
-# Logging
-crudini --set $cfg \
- DEFAULT \
- log_file \
- "${CINDER_VOLUME_LOG_FILE}"
-
-# IP address on which OpenStack Volume API listens
-crudini --set $cfg \
- DEFAULT \
- osapi_volume_listen \
- "${CINDER_VOLUME_API_LISTEN}"
-
-# The IP address that the iSCSI daemon is listening on
-crudini --set $cfg \
- DEFAULT \
- iscsi_ip_address \
- "${ISCSI_IP_ADDRESS}"
-
-# Set to false when using loopback devices (testing)
-crudini --set $cfg \
- DEFAULT \
- secure_delete \
- "false"
-
-crudini --set $cfg \
- DEFAULT \
- enabled_backends \
- "${CINDER_ENABLED_BACKEND}"
-
-crudini --set $cfg \
- lvm57 \
- iscsi_helper \
- "${ISCSI_HELPER}"
-
-crudini --set $cfg \
- lvm57 \
- volume_group \
- "${CINDER_VOLUME_GROUP}"
-
-crudini --set $cfg \
- lvm57 \
- volume_driver \
- "${CINDER_VOLUME_DRIVER}"
-
-crudini --set $cfg \
- lvm57 \
- iscsi_ip_address \
- "${ISCSI_IP_ADDRESS}"
-
-crudini --set $cfg \
- lvm57 \
- volume_backend_name \
- "${CINDER_VOLUME_BACKEND_NAME}"
-
-sed -i 's/udev_sync = 1/udev_sync = 0/' /etc/lvm/lvm.conf
-sed -i 's/udev_rules = 1/udev_rules = 0/' /etc/lvm/lvm.conf
-sed -i 's/use_lvmetad = 1/use_lvmetad = 0/' /etc/lvm/lvm.conf
-
-echo "Starting cinder-volume"
-exec /usr/bin/cinder-volume --config-file /etc/cinder/cinder.conf
+../../../../common/cinder-app/cinder-volume/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/cinder-app/cinder-volume/volume-group-create.sh b/docker/centos/binary/cinder-app/cinder-volume/volume-group-create.sh
index 908d987b0..eeeca7063 100755..120000
--- a/docker/centos/binary/cinder-app/cinder-volume/volume-group-create.sh
+++ b/docker/centos/binary/cinder-app/cinder-volume/volume-group-create.sh
@@ -1,22 +1 @@
-#!/bin/bash
-
-# The script will create the cinder-volume volume group that will
-# allow cinder to create volumes from a backing file.
-# This is based off devstack.
-set -e
-
-backing_file=/opt/data/cinder_volume
-
-check_required_vars CINDER_LVM_LO_VOLUME_SIZE CINDER_VOLUME_GROUP
-
-if ! vgs ${CINDER_VOLUME_GROUP}; then
- [[ ! -f $backing_file ]] && truncate -s ${CINDER_LVM_LO_VOLUMES_SIZE} $backing_file
- vg_dev=`losetup -f --show $backing_file`
- if ! vgs ${CINDER_VOLUME_GROUP}; then
- vgcreate ${CINDER_VOLUME_GROUP} $vg_dev
- fi
-fi
-
-# Remove iscsi targets
-cinder-rtstool get-targets | xargs -rn 1 cinder-rtstool delete
-
+../../../../common/cinder-app/cinder-volume/volume-group-create.sh \ No newline at end of file
diff --git a/docker/centos/binary/designate/designate-api/start.sh b/docker/centos/binary/designate/designate-api/start.sh
index aae50ea8f..f96fe1a34 100755..120000
--- a/docker/centos/binary/designate/designate-api/start.sh
+++ b/docker/centos/binary/designate/designate-api/start.sh
@@ -1,37 +1 @@
-#!/bin/bash
-set -e
-
-. /opt/kolla/kolla-common.sh
-. /opt/kolla/config-designate.sh
-
-CONF=/etc/designate/designate.conf
-
-check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
- DESIGNATE_KEYSTONE_USER DESIGNATE_KEYSTONE_PASSWORD \
- KEYSTONE_AUTH_PROTOCOL ADMIN_TENANT_NAME \
- DESIGNATE_API_SERVICE_HOST DESIGNATE_API_SERVICE_PORT \
- KEYSTONE_ADMIN_SERVICE_PORT
-
-export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
-export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v2.0"
-
-fail_unless_os_service_running keystone
-
-crux user-create \
- -n ${DESIGNATE_KEYSTONE_USER} \
- -p ${DESIGNATE_KEYSTONE_PASSWORD} \
- -t ${ADMIN_TENANT_NAME} \
- -r admin
-
-crux endpoint-create \
- --remove-all \
- -n ${DESIGNATE_KEYSTONE_USER} \
- -t dns \
- -I "${KEYSTONE_AUTH_PROTOCOL}://${DESIGNATE_API_SERVICE_HOST}:${DESIGNATE_API_SERVICE_PORT}/v1" \
- -P "${KEYSTONE_AUTH_PROTOCOL}://${DESIGNATE_API_SERVICE_HOST}:${DESIGNATE_API_SERVICE_PORT}/v1" \
- -A "${KEYSTONE_AUTH_PROTOCOL}://${DESIGNATE_API_SERVICE_HOST}:${DESIGNATE_API_SERVICE_PORT}/v1"
-
-crudini --set $CONF service:api api_paste_config "/usr/share/designate/api-paste.ini"
-crudini --set $CONF service:api api_port "${DESIGNATE_API_SERVICE_PORT}"
-
-exec /usr/bin/designate-api
+../../../../common/designate/designate-api/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/designate/designate-backend-bind9/start.sh b/docker/centos/binary/designate/designate-backend-bind9/start.sh
index 90d2de676..918411fa1 100755..120000
--- a/docker/centos/binary/designate/designate-backend-bind9/start.sh
+++ b/docker/centos/binary/designate/designate-backend-bind9/start.sh
@@ -1,60 +1 @@
-#!/bin/bash
-set -e
-
-. /opt/kolla/kolla-common.sh
-
-check_required_vars DESIGNATE_MASTERNS DESIGNATE_SLAVENS DESIGNATE_BIND9_RNDC_KEY \
- DESIGNATE_ALLOW_RECURSION
-
-NAMEDCFG=/etc/named.conf
-
-# /var/named is coming from a VOLUME definition but at first boot it needs to
-# be populated from the original container since else it would be missing some
-# Bind9 core files. These files have been saved during the build phase.
-
-if [ ! -f /var/named/named.ca ]; then
- cp -pr /opt/kolla/var-named/* /var/named/
-fi
-
-# When rndc adds a new domain, bind adds the call in an nzf file in this
-# directory.
-chmod 770 /var/named
-chown root:named /var/named
-
-# Default Bind9 behavior is to enable recursion, disable if wanted.
-if [ "${DESIGNATE_ALLOW_RECURSION}" == "false" ]; then
- sed -i -r "s/(recursion) yes/\1 no/" $NAMEDCFG
-fi
-
-sed -i -r "/listen-on port 53/d" $NAMEDCFG
-sed -i -r "/listen-on-v6/d" $NAMEDCFG
-sed -i -r "s,/\* Path to ISC DLV key \*/,allow-new-zones yes;," $NAMEDCFG
-sed -i -r "/allow-query .+;/d" $NAMEDCFG
-
-if ! grep -q rndc-key /etc/named.conf; then
- cat >> /etc/named.conf <<EOF
-include "/etc/rndc.key";
-controls {
- inet ${DESIGNATE_SLAVENS} allow { ${DESIGNATE_MASTERNS}; } keys { "rndc-key"; };
-};
-EOF
-fi
-
-cat > /etc/rndc.key <<EOF
-key "rndc-key" {
- algorithm hmac-md5;
- secret "${DESIGNATE_BIND9_RNDC_KEY}";
-};
-EOF
-cat > /etc/rndc.conf <<EOF
-options {
- default-key "rndc-key";
- default-server 127.0.0.1;
- default-port 953;
-};
-EOF
-cat /etc/rndc.key >> /etc/rndc.conf
-chown named /etc/rndc.key
-
-# Launch and keep in the foreground.
-exec /usr/sbin/named -u named -g
+../../../../common/designate/designate-backend-bind9/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/designate/designate-base/config-designate.sh b/docker/centos/binary/designate/designate-base/config-designate.sh
index 6edfd1bd2..77aa738de 100755..120000
--- a/docker/centos/binary/designate/designate-base/config-designate.sh
+++ b/docker/centos/binary/designate/designate-base/config-designate.sh
@@ -1,79 +1 @@
-#!/bin/bash
-
-set -e
-
-. /opt/kolla/kolla-common.sh
-
-get_or_create_domain() {
- local DOMAIN_NAME=$1
-
- DOMAIN_ID=$(designate domain-create --name $DOMAIN_NAME | awk '/id/ { print $4; }')
- # Searching domain if not created
- if [ -z $DOMAIN_ID ]; then
- DOMAIN_ID=$(designate domain-list | awk "/$DOMAIN_NAME/ { print \$2; }")
- fi
- # Fail if domain still don't exist
- if [ -z $DOMAIN_ID ]; then
- echo "Creating domain failed" 1>&2
- exit 1
- fi
-
- echo $DOMAIN_ID
-}
-
-check_required_vars DESIGNATE_DB_PASSWORD DESIGNATE_KEYSTONE_PASSWORD \
- KEYSTONE_PUBLIC_SERVICE_HOST RABBITMQ_SERVICE_HOST \
- DESIGNATE_BIND9_RNDC_KEY DESIGNATE_BACKEND \
- KEYSTONE_PUBLIC_SERVICE_PORT DESIGNATE_KEYSTONE_USER \
- RABBIT_USERID RABBIT_PASSWORD DESIGNATE_DB_USER \
- DESIGNATE_DB_NAME KEYSTONE_AUTH_PROTOCOL \
- KEYSTONE_ADMIN_SERVICE_HOST KEYSTONE_ADMIN_SERVICE_PORT \
- DEBUG_LOGGING DESIGNATE_POOLMAN_POOLID
-
-fail_unless_db
-dump_vars
-
-cat > /openrc <<EOF
-export OS_AUTH_URL="http://${KEYSTONE_PUBLIC_SERVICE_HOST}:${KEYSTONE_PUBLIC_SERVICE_PORT}/v2.0"
-export OS_USERNAME="${DESIGNATE_KEYSTONE_USER}"
-export OS_PASSWORD="${DESIGNATE_KEYSTONE_PASSWORD}"
-export OS_TENANT_NAME="${ADMIN_TENANT_NAME}"
-EOF
-
-conf=/etc/designate/designate.conf
-
-# Regular configuration.
-crudini --set $conf DEFAULT log_file ""
-crudini --set $conf DEFAULT use_stderr "True"
-crudini --set $conf DEFAULT debug "${DEBUG_LOGGING}"
-crudini --set $conf DEFAULT rpc_backend "designate.openstack.common.rpc.impl_kombu"
-
-crudini --set $conf oslo_messaging_rabbit rabbit_host "${RABBITMQ_SERVICE_HOST}"
-crudini --set $conf oslo_messaging_rabbit rabbit_userid "${RABBIT_USERID}"
-crudini --set $conf oslo_messaging_rabbit rabbit_password "${RABBIT_PASSWORD}"
-
-crudini --set $conf storage:sqlalchemy connection "mysql://${DESIGNATE_DB_USER}:${DESIGNATE_DB_PASSWORD}@${MARIADB_SERVICE_HOST}/${DESIGNATE_DB_NAME}"
-
-crudini --set $conf service:api auth_strategy "keystone"
-crudini --set $conf service:api api_host "${PUBLIC_IP}"
-
-# Eventhough this is a central-scoped item, it's used in other Designate
-# components as well. Thus it should be configured here, from designate-base.
-crudini --set $conf service:central default_pool_id "${DESIGNATE_POOLMAN_POOLID}"
-
-crudini --set $conf keystone_authtoken identity_uri "${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}"
-crudini --set $conf keystone_authtoken auth_uri "${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_PUBLIC_SERVICE_HOST}:${KEYSTONE_PUBLIC_SERVICE_PORT}/v2.0"
-crudini --set $conf keystone_authtoken admin_tenant_name "${ADMIN_TENANT_NAME}"
-crudini --set $conf keystone_authtoken admin_user "${DESIGNATE_KEYSTONE_USER}"
-crudini --set $conf keystone_authtoken admin_password "${DESIGNATE_KEYSTONE_PASSWORD}"
-
-if [ "${DESIGNATE_BACKEND}" == "bind9" ]; then
- # Configure a key for RNDC so it can connect with Bind9 to create/delete
- # zones.
- cat > /etc/rndc.key <<EOF
-key "rndc-key" {
- algorithm hmac-md5;
- secret "${DESIGNATE_BIND9_RNDC_KEY}";
-};
-EOF
-fi
+../../../../common/designate/designate-base/config-designate.sh \ No newline at end of file
diff --git a/docker/centos/binary/designate/designate-central/start.sh b/docker/centos/binary/designate/designate-central/start.sh
index fef7e2353..9e0a8c484 100755..120000
--- a/docker/centos/binary/designate/designate-central/start.sh
+++ b/docker/centos/binary/designate/designate-central/start.sh
@@ -1,24 +1 @@
-#!/bin/bash
-set -e
-
-. /opt/kolla/kolla-common.sh
-. /opt/kolla/config-designate.sh
-
-check_required_vars MARIADB_SERVICE_HOST DB_ROOT_PASSWORD DESIGNATE_DB_NAME \
- DESIGNATE_DB_USER DESIGNATE_DB_PASSWORD DESIGNATE_INITDB
-
-fail_unless_db
-
-CONF=/etc/designate/designate.conf
-
-if [ "${DESIGNATE_INITDB}" == "true" ]; then
- echo "Configuring database"
- mysql -h ${MARIADB_SERVICE_HOST} -u root -p"${DB_ROOT_PASSWORD}" mysql <<EOF
-CREATE DATABASE IF NOT EXISTS ${DESIGNATE_DB_NAME};
-GRANT ALL PRIVILEGES ON ${DESIGNATE_DB_NAME}.* TO '${DESIGNATE_DB_USER}'@'%' IDENTIFIED BY '${DESIGNATE_DB_PASSWORD}'
-EOF
-
- designate-manage database sync
-fi
-
-exec /usr/bin/designate-central
+../../../../common/designate/designate-central/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/designate/designate-mdns/start.sh b/docker/centos/binary/designate/designate-mdns/start.sh
index a3e5df274..f7bf747fc 100755..120000
--- a/docker/centos/binary/designate/designate-mdns/start.sh
+++ b/docker/centos/binary/designate/designate-mdns/start.sh
@@ -1,17 +1 @@
-#!/bin/bash
-set -e
-
-. /opt/kolla/kolla-common.sh
-. /opt/kolla/config-designate.sh
-
-check_required_vars DESIGNATE_MASTERNS DESIGNATE_MDNS_PORT
-
-CONF=/etc/designate/designate.conf
-
-crudini --set $CONF service:mdns workers "1"
-crudini --set $CONF service:mdns host "${DESIGNATE_MASTERNS}"
-crudini --set $CONF service:mdns port "${DESIGNATE_MDNS_PORT}"
-crudini --set $CONF service:mdns tcp_backlog "100"
-crudini --set $CONF service:mdns all_tcp "False"
-
-exec /usr/bin/designate-mdns
+../../../../common/designate/designate-mdns/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/designate/designate-poolmanager/start.sh b/docker/centos/binary/designate/designate-poolmanager/start.sh
index f5222b3f4..cc428b4fe 100755..120000
--- a/docker/centos/binary/designate/designate-poolmanager/start.sh
+++ b/docker/centos/binary/designate/designate-poolmanager/start.sh
@@ -1,54 +1 @@
-#!/bin/bash
-set -e
-
-. /opt/kolla/kolla-common.sh
-. /opt/kolla/config-designate.sh
-
-check_required_vars DESIGNATE_MASTERNS DESIGNATE_BACKEND DESIGNATE_SLAVENS \
- DESIGNATE_MDNS_PORT DESIGNATE_DNS_PORT DESIGNATE_POOLMAN_POOLID \
- DESIGNATE_POOLMAN_TARGETS DESIGNATE_POOLMAN_NSS \
- DESIGNATE_POOLMAN_POOLID
-
-CONF=/etc/designate/designate.conf
-
-if [ "${DESIGNATE_BACKEND}" == "bind9" ]; then
- TYPE="bind9"
- OPTIONS="rndc_host: ${DESIGNATE_SLAVENS}, rndc_key_file: /etc/rndc.key"
-else
- echo Unsupported backend: ${DESIGNATE_BACKEND}
- exit
-fi
-
-crudini --set $CONF service:pool_manager workers "1"
-crudini --set $CONF service:pool_manager enable_recovery_timer "False"
-crudini --set $CONF service:pool_manager periodic_recovery_interval "120"
-crudini --set $CONF service:pool_manager enable_sync_timer "True"
-crudini --set $CONF service:pool_manager periodic_sync_interval "1800"
-crudini --set $CONF service:pool_manager poll_max_retries "10"
-crudini --set $CONF service:pool_manager poll_delay "5"
-crudini --set $CONF service:pool_manager poll_retry_interval "15"
-crudini --set $CONF service:pool_manager pool_id "${DESIGNATE_POOLMAN_POOLID}"
-crudini --set $CONF service:pool_manager cache_driver "noop"
-
-# TODO: use this to use memcached
-#crudini --set $CONF service:pool_manager cache_driver memcache
-#crudini --set $CONF service:pool_manager memcached_servers ${MEMCACHED_HOST}
-
-# Specify the id of the pool managed through pool_manager. Central gets
-# configured with this pool_id as well.
-crudini --set $CONF service:pool_manager pool_id "${DESIGNATE_POOLMAN_POOLID}"
-
-crudini --set $CONF pool:${DESIGNATE_POOLMAN_POOLID} nameservers "${DESIGNATE_POOLMAN_NSS}"
-crudini --set $CONF pool:${DESIGNATE_POOLMAN_POOLID} targets "${DESIGNATE_POOLMAN_TARGETS}"
-
-crudini --set $CONF pool_target:${DESIGNATE_POOLMAN_TARGETS} type "${TYPE}"
-crudini --set $CONF pool_target:${DESIGNATE_POOLMAN_TARGETS} options "${OPTIONS}"
-# This is the mdns container, which is the master nameserver.
-crudini --set $CONF pool_target:${DESIGNATE_POOLMAN_TARGETS} masters "${DESIGNATE_MASTERNS}:${DESIGNATE_MDNS_PORT}"
-crudini --set $CONF pool_target:${DESIGNATE_POOLMAN_TARGETS} host "${DESIGNATE_MASTERNS}"
-crudini --set $CONF pool_target:${DESIGNATE_POOLMAN_TARGETS} port "${DESIGNATE_DNS_PORT}"
-
-crudini --set $CONF pool_nameserver:${DESIGNATE_POOLMAN_NSS} host "${DESIGNATE_MASTERNS}"
-crudini --set $CONF pool_nameserver:${DESIGNATE_POOLMAN_NSS} port "${DESIGNATE_DNS_PORT}"
-
-exec /usr/bin/designate-pool-manager
+../../../../common/designate/designate-poolmanager/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/galera/config-galera.sh b/docker/centos/binary/galera/config-galera.sh
index f0ab542e1..f6782bb87 100755..120000
--- a/docker/centos/binary/galera/config-galera.sh
+++ b/docker/centos/binary/galera/config-galera.sh
@@ -1,94 +1 @@
-#!/bin/bash
-
-. /opt/kolla/kolla-common.sh
-
-check_required_vars DB_CLUSTER_BIND_ADDRESS DB_CLUSTER_NAME DB_CLUSTER_NODES \
- DB_ROOT_PASSWORD DB_CLUSTER_WSREP_METHOD
-
-CFG=/etc/my.cnf.d/server.cnf
-DB_CLUSTER_INIT_SQL=/tmp/mysql-first-time.sql
-
-function configure_files {
- crudini --set $CFG mariadb bind-address "${DB_CLUSTER_BIND_ADDRESS}"
- crudini --set $CFG mariadb binlog_format "ROW"
- crudini --set $CFG mariadb character-set-server "utf8"
- crudini --set $CFG mariadb collation-server "utf8_general_ci"
- crudini --set $CFG mariadb datadir "/var/lib/mysql"
- crudini --set $CFG mariadb default-storage-engine "innodb"
- crudini --set $CFG mariadb init-connect "'SET NAMES utf8'"
- crudini --set $CFG mariadb innodb_autoinc_lock_mode "2"
- crudini --set $CFG mariadb innodb_file_per_table 1
- crudini --set $CFG mariadb innodb_flush_log_at_trx_commit "2"
- crudini --set $CFG mariadb innodb_locks_unsafe_for_binlog "1"
- crudini --set $CFG mariadb innodb_log_file_size "100M"
- crudini --set $CFG mariadb query_cache_size "0"
- crudini --set $CFG mariadb query_cache_type "0"
- crudini --set $CFG mariadb wsrep_cluster_address "gcomm://${DB_CLUSTER_NODES}"
- crudini --set $CFG mariadb wsrep_cluster_name "${DB_CLUSTER_NAME}"
- crudini --set $CFG mariadb wsrep_provider "/usr/lib64/galera/libgalera_smm.so"
- crudini --set $CFG mariadb wsrep_sst_auth "'root:${DB_ROOT_PASSWORD}'"
- crudini --set $CFG mariadb wsrep_sst_method "${DB_CLUSTER_WSREP_METHOD}"
-}
-
-function bootstrap_database() {
- mysqld_safe &
- # Waiting for deamon
- sleep 10
- expect -c '
- set timeout 10
- spawn mysql_secure_installation
- expect "Enter current password for root (enter for none):"
- send "\r"
- expect "Set root password?"
- send "y\r"
- expect "New password:"
- send "'"${DB_ROOT_PASSWORD}"'\r"
- expect "Re-enter new password:"
- send "'"${DB_ROOT_PASSWORD}"'\r"
- expect "Remove anonymous users?"
- send "y\r"
- expect "Disallow root login remotely?"
- send "n\r"
- expect "Remove test database and access to it?"
- send "y\r"
- expect "Reload privilege tables now?"
- send "y\r"
- expect eof'
- mysqladmin -p"${DB_ROOT_PASSWORD}" shutdown
-}
-
-function configure_db {
- bootstrap_database
-
- echo "GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY '$DB_ROOT_PASSWORD' ;" > $DB_CLUSTER_INIT_SQL
-
- if [ "$MARIADB_DATABASE" ]; then
- echo "CREATE DATABASE IF NOT EXISTS $MARIADB_DATABASE ;" >> $DB_CLUSTER_INIT_SQL
- fi
-
- if [ "$MARIADB_USER" -a "$MARIADB_PASSWORD" ]; then
- echo "CREATE USER '$MARIADB_USER'@'%' IDENTIFIED BY '$MARIADB_PASSWORD' ;" >> $DB_CLUSTER_INIT_SQL
-
- if [ "$MARIADB_DATABASE" ]; then
- echo "GRANT ALL ON $MARIADB_DATABASE.* TO '$MARIADB_USER'@'%' ;" >> $DB_CLUSTER_INIT_SQL
- fi
- fi
-
- echo "FLUSH PRIVILEGES" >> $DB_CLUSTER_INIT_SQL
-}
-
-function populate_db {
- if [[ $(ls /var/lib/mysql) == "" ]]; then
- echo "POPULATING NEW DB"
- mysql_install_db
- chown -R mysql /var/lib/mysql
- else
- echo "DB ALREADY EXISTS"
- fi
-}
-
-function prepare_db {
- populate_db
- configure_db
- configure_files
-}
+../../../common/galera/config-galera.sh \ No newline at end of file
diff --git a/docker/centos/binary/galera/start.sh b/docker/centos/binary/galera/start.sh
index 9288b77cc..1fa9a143d 100755..120000
--- a/docker/centos/binary/galera/start.sh
+++ b/docker/centos/binary/galera/start.sh
@@ -1,14 +1 @@
-#!/bin/bash
-
-. /opt/kolla/kolla-common.sh
-. /opt/kolla/config-galera.sh
-
-check_required_vars DB_CLUSTER_INIT_DB
-prepare_db
-
-if [[ "${DB_CLUSTER_INIT_DB}" == "true" ]] && ! [[ -a /var/lib/mysql/cluster.exists ]]; then
- DB_CLUSTER_IS_MASTER_NODE="--wsrep-new-cluster"
- touch /var/lib/mysql/cluster.exists
-fi
-
-mysqld_safe --init-file=$DB_CLUSTER_INIT_SQL $DB_CLUSTER_IS_MASTER_NODE \ No newline at end of file
+../../../common/galera/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/glance/glance-api/check.sh b/docker/centos/binary/glance/glance-api/check.sh
index f97ef70f4..73dd5e253 100755..120000
--- a/docker/centos/binary/glance/glance-api/check.sh
+++ b/docker/centos/binary/glance/glance-api/check.sh
@@ -1,17 +1 @@
-#!/bin/bash
-
-RES=0
-
-. /openrc
-if ! keystone token-get > /dev/null; then
- echo "ERROR: keystone token-get failed" >&2
- RES=1
-else
- if ! glance image-list > /dev/null; then
- echo "ERROR: glance image-list failed" >&2
- RES=1
- fi
-fi
-
-exit $RES
-
+../../../../common/glance/glance-api/check.sh \ No newline at end of file
diff --git a/docker/centos/binary/glance/glance-api/start.sh b/docker/centos/binary/glance/glance-api/start.sh
index c546333f4..6740e1fe9 100755..120000
--- a/docker/centos/binary/glance/glance-api/start.sh
+++ b/docker/centos/binary/glance/glance-api/start.sh
@@ -1,52 +1 @@
-#!/bin/bash
-
-set -e
-
-. /opt/kolla/kolla-common.sh
-. /opt/kolla/config-glance.sh
-: ${GLANCE_API_SERVICE_HOST:=$PUBLIC_IP}
-
-check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
- GLANCE_KEYSTONE_USER GLANCE_KEYSTONE_PASSWORD \
- ADMIN_TENANT_NAME GLANCE_API_SERVICE_HOST \
- PUBLIC_IP
-
-fail_unless_os_service_running keystone
-
-export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
-export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v2.0"
-
-crux user-create --update \
- -n "${GLANCE_KEYSTONE_USER}" \
- -p "${GLANCE_KEYSTONE_PASSWORD}" \
- -t "${ADMIN_TENANT_NAME}" \
- -r admin
-
-crux endpoint-create --remove-all \
- -n glance -t image \
- -I "http://${GLANCE_API_SERVICE_HOST}:9292" \
- -P "http://${PUBLIC_IP}:9292" \
- -A "http://${GLANCE_API_SERVICE_HOST}:9292"
-
-# turn on notification sending by glance
-crudini --set /etc/glance/glance-api.conf \
- DEFAULT \
- notification_driver \
- "messaging"
-
-crudini --set /etc/glance/glance-api.conf \
- DEFAULT \
- rabbit_host \
- "${RABBITMQ_SERVICE_HOST}"
-
-crudini --set /etc/glance/glance-api.conf \
- DEFAULT \
- registry_host \
- "${GLANCE_REGISTRY_SERVICE_HOST}"
-
-crudini --set /etc/glance/glance-api.conf \
- DEFAULT \
- debug \
- "True"
-
-exec /usr/bin/glance-api
+../../../../common/glance/glance-api/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/glance/glance-base/config-glance.sh b/docker/centos/binary/glance/glance-base/config-glance.sh
index 97d076c11..d5c26f0b8 100644..120000
--- a/docker/centos/binary/glance/glance-base/config-glance.sh
+++ b/docker/centos/binary/glance/glance-base/config-glance.sh
@@ -1,63 +1 @@
-#!/bin/bash
-
-set -e
-
-. /opt/kolla/kolla-common.sh
-
-: ${ADMIN_TENANT_NAME:=admin}
-: ${GLANCE_DB_NAME:=glance}
-: ${GLANCE_DB_USER:=glance}
-: ${GLANCE_KEYSTONE_USER:=glance}
-: ${KEYSTONE_AUTH_PROTOCOL:=http}
-: ${PUBLIC_IP:=$GLANCE_API_PORT_9292_TCP_ADDR}
-
-check_required_vars GLANCE_DB_PASSWORD GLANCE_KEYSTONE_PASSWORD
-dump_vars
-
-cat > /openrc <<EOF
-export OS_AUTH_URL="http://${KEYSTONE_PUBLIC_SERVICE_HOST}:5000/v2.0"
-export OS_USERNAME="${GLANCE_KEYSTONE_USER}"
-export OS_PASSWORD="${GLANCE_KEYSTONE_PASSWORD}"
-export OS_TENANT_NAME="${ADMIN_TENANT_NAME}"
-EOF
-
-for cfg in /etc/glance/glance-api.conf /etc/glance/glance-registry.conf; do
- crudini --set $cfg \
- DEFAULT \
- log_file \
- ""
-
- for option in auth_protocol auth_host auth_port; do
- crudini --del $cfg \
- keystone_authtoken \
- $option
- done
-
- crudini --set $cfg \
- keystone_authtoken \
- auth_uri \
- "http://${KEYSTONE_PUBLIC_SERVICE_HOST}:5000/"
- crudini --set $cfg \
- keystone_authtoken \
- admin_tenant_name \
- "${ADMIN_TENANT_NAME}"
- crudini --set $cfg \
- keystone_authtoken \
- admin_user \
- "${GLANCE_KEYSTONE_USER}"
- crudini --set $cfg \
- keystone_authtoken \
- admin_password \
- "${GLANCE_KEYSTONE_PASSWORD}"
-
- crudini --set $cfg \
- paste_deploy \
- flavor \
- keystone
-
- crudini --set $cfg \
- database \
- connection \
- "mysql://${GLANCE_DB_USER}:${GLANCE_DB_PASSWORD}@${MARIADB_SERVICE_HOST}/${GLANCE_DB_NAME}"
-done
-
+../../../../common/glance/glance-base/config-glance.sh \ No newline at end of file
diff --git a/docker/centos/binary/glance/glance-registry/start.sh b/docker/centos/binary/glance/glance-registry/start.sh
index 5f590fb1c..1295cdc31 100755..120000
--- a/docker/centos/binary/glance/glance-registry/start.sh
+++ b/docker/centos/binary/glance/glance-registry/start.sh
@@ -1,21 +1 @@
-#!/bin/bash
-
-set -e
-
-. /opt/kolla/kolla-common.sh
-. /opt/kolla/config-glance.sh
-
-check_required_vars GLANCE_DB_NAME GLANCE_DB_USER GLANCE_DB_PASSWORD
-# lets wait for the DB to be available
-wait_for 25 1 check_for_db
-
-mysql -h ${MARIADB_SERVICE_HOST} -u root -p${DB_ROOT_PASSWORD} mysql <<EOF
-CREATE DATABASE IF NOT EXISTS ${GLANCE_DB_NAME} DEFAULT CHARACTER SET utf8;
-GRANT ALL PRIVILEGES ON ${GLANCE_DB_NAME}.* TO
- '${GLANCE_DB_USER}'@'%' IDENTIFIED BY '${GLANCE_DB_PASSWORD}'
-
-EOF
-
-/usr/bin/glance-manage db_sync
-
-exec /usr/bin/glance-registry
+../../../../common/glance/glance-registry/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/hautoproxy/haproxy.cfg.tmpl b/docker/centos/binary/hautoproxy/haproxy.cfg.tmpl
index cd1174b21..dc3f45c31 100644..120000
--- a/docker/centos/binary/hautoproxy/haproxy.cfg.tmpl
+++ b/docker/centos/binary/hautoproxy/haproxy.cfg.tmpl
@@ -1,26 +1 @@
-global
- daemon
- maxconn 4096
- pidfile /var/run/haproxy.pid
-
-defaults
- mode tcp
- timeout connect 5s
- timeout client 1m
- timeout server 1m
- option redispatch
- balance roundrobin
-
-listen stats :1936
- mode http
- stats enable
- stats hide-version
- #stats realm Haproxy\ Statistics
- stats uri /
- #stats auth Username:Password
-
-{% for service in services %}
-listen {{ service.service_name }}
- bind 127.0.0.1:{{service.local_port}}
- server {{ service.remote_name }} {{ service.remote_addr }}:{{ service.remote_port}} check inter 2s rise 3 fall 2
-{% endfor %}
+../../../common/hautoproxy/haproxy.cfg.tmpl \ No newline at end of file
diff --git a/docker/centos/binary/hautoproxy/start.py b/docker/centos/binary/hautoproxy/start.py
index 877b22157..f89efa2f8 100755..120000
--- a/docker/centos/binary/hautoproxy/start.py
+++ b/docker/centos/binary/hautoproxy/start.py
@@ -1,65 +1 @@
-#!/usr/bin/python
-
-'''This script configures and starts a local haproxy instances, bound to
-127.0.0.1, that forwards connections all of the discovered
-docker/kubernetes environment variables.'''
-
-import argparse
-import os
-import sys
-from jinja2 import Environment, FileSystemLoader
-import re
-import urlparse
-
-re_url = re.compile(
- '^(?P<name>.*)_PORT_(?P<port>\d+)_(?P<proto>(UDP|TCP))$')
-
-def parse_args():
- p = argparse.ArgumentParser()
- p.add_argument('--output', '-o',
- default='/etc/haproxy/haproxy.cfg')
- p.add_argument('--no-start', '-n',
- action='store_true')
- p.add_argument('--template-dir', '-t',
- default='/etc/haproxy/templates')
- return p.parse_args()
-
-def discover_services():
- services = []
- for k in os.environ:
- mo = re_url.match(k)
-
- if mo:
- parts = urlparse.urlparse(os.environ[k])
- remote_host,remote_port = parts.netloc.split(':')
- service_name = '%(name)s-%(port)s' % mo.groupdict()
-
- services.append({
- 'remote_name': mo.group('name'),
- 'remote_addr': remote_host,
- 'remote_port': remote_port,
- 'remote_proto': parts.scheme,
- 'local_port': mo.group('port'),
- 'service_name': service_name,
- })
-
- return services
-
-def main():
- args = parse_args()
- services = discover_services()
-
- env = Environment(loader=FileSystemLoader(['.',
- args.template_dir]))
- template = env.get_template('haproxy.cfg.tmpl')
- with open(args.output, 'w') as fd:
- fd.write(template.render(services=services))
-
- if args.no_start:
- return
-
- os.execlp('haproxy', 'haproxy', '-f', args.output, '-db')
-
-if __name__ == '__main__':
- main()
-
+../../../common/hautoproxy/start.py \ No newline at end of file
diff --git a/docker/centos/binary/heat/heat-api-cfn/check.sh b/docker/centos/binary/heat/heat-api-cfn/check.sh
index ee03dc6d2..68fce28bf 100755..120000
--- a/docker/centos/binary/heat/heat-api-cfn/check.sh
+++ b/docker/centos/binary/heat/heat-api-cfn/check.sh
@@ -1,16 +1 @@
-#!/bin/bash
-
-RES=0
-
-. /openrc
-if ! keystone token-get > /dev/null; then
- echo "ERROR: keystone token-get failed" >&2
- RES=1
-else
- if ! heat stack-list > /dev/null; then
- echo "ERROR: heat stack-list failed" >&2
- RES=1
- fi
-fi
-
-exit $RES
+../../../../common/heat/heat-api-cfn/check.sh \ No newline at end of file
diff --git a/docker/centos/binary/heat/heat-api-cfn/start.sh b/docker/centos/binary/heat/heat-api-cfn/start.sh
index bcd72250b..a71201d4b 100755..120000
--- a/docker/centos/binary/heat/heat-api-cfn/start.sh
+++ b/docker/centos/binary/heat/heat-api-cfn/start.sh
@@ -1,28 +1 @@
-#!/bin/bash
-set -e
-
-. /opt/kolla/kolla-common.sh
-. /opt/kolla/config-heat.sh
-
-check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
- HEAT_CFN_KEYSTONE_USER HEAT_CFN_KEYSTONE_PASSWORD \
- KEYSTONE_AUTH_PROTOCOL KEYSTONE_ADMIN_SERVICE_PORT \
- ADMIN_TENANT_NAME HEAT_API_CFN_SERVICE_HOST \
- HEAT_API_CFN_SERVICE_PORT
-
-fail_unless_os_service_running keystone
-
-export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
-export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v2.0"
-
-crux user-create -n ${HEAT_CFN_KEYSTONE_USER} \
- -p ${HEAT_CFN_KEYSTONE_PASSWORD} \
- -t ${ADMIN_TENANT_NAME} \
- -r admin
-
-crux endpoint-create --remove-all -n ${HEAT_CFN_KEYSTONE_USER} -t cloudformation \
- -I "${KEYSTONE_AUTH_PROTOCOL}://${HEAT_API_CFN_SERVICE_HOST}:${HEAT_API_CFN_SERVICE_PORT}/v1" \
- -P "${KEYSTONE_AUTH_PROTOCOL}://${HEAT_API_CFN_SERVICE_HOST}:${HEAT_API_CFN_SERVICE_PORT}/v1" \
- -A "${KEYSTONE_AUTH_PROTOCOL}://${HEAT_API_CFN_SERVICE_HOST}:${HEAT_API_CFN_SERVICE_PORT}/v1"
-
-exec /usr/bin/heat-api-cfn
+../../../../common/heat/heat-api-cfn/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/heat/heat-api/check.sh b/docker/centos/binary/heat/heat-api/check.sh
index ee03dc6d2..1e72d2e2c 100755..120000
--- a/docker/centos/binary/heat/heat-api/check.sh
+++ b/docker/centos/binary/heat/heat-api/check.sh
@@ -1,16 +1 @@
-#!/bin/bash
-
-RES=0
-
-. /openrc
-if ! keystone token-get > /dev/null; then
- echo "ERROR: keystone token-get failed" >&2
- RES=1
-else
- if ! heat stack-list > /dev/null; then
- echo "ERROR: heat stack-list failed" >&2
- RES=1
- fi
-fi
-
-exit $RES
+../../../../common/heat/heat-api/check.sh \ No newline at end of file
diff --git a/docker/centos/binary/heat/heat-api/start.sh b/docker/centos/binary/heat/heat-api/start.sh
index b57aaa710..cf3eb022c 100755..120000
--- a/docker/centos/binary/heat/heat-api/start.sh
+++ b/docker/centos/binary/heat/heat-api/start.sh
@@ -1,29 +1 @@
-#!/bin/bash
-set -e
-
-. /opt/kolla/kolla-common.sh
-. /opt/kolla/config-heat.sh
-
-check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
- HEAT_KEYSTONE_USER HEAT_KEYSTONE_PASSWORD \
- KEYSTONE_AUTH_PROTOCOL ADMIN_TENANT_NAME \
- HEAT_API_SERVICE_HOST PUBLIC_IP
-
-fail_unless_os_service_running keystone
-
-export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
-export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:35357/v2.0"
-crux user-create -n ${HEAT_KEYSTONE_USER} \
- -p ${HEAT_KEYSTONE_PASSWORD} \
- -t ${ADMIN_TENANT_NAME} \
- -r admin
-
-crux endpoint-create --remove-all -n ${HEAT_KEYSTONE_USER} -t orchestration \
- -I "${KEYSTONE_AUTH_PROTOCOL}://${HEAT_API_SERVICE_HOST}:8004/v1/%(tenant_id)s" \
- -P "${KEYSTONE_AUTH_PROTOCOL}://${PUBLIC_IP}:8004/v1/%(tenant_id)s" \
- -A "${KEYSTONE_AUTH_PROTOCOL}://${HEAT_API_SERVICE_HOST}:8004/v1/%(tenant_id)s"
-
-# will use crux after https://github.com/larsks/crux/issues/1 is implemented
-openstack role list --os-token="${KEYSTONE_ADMIN_TOKEN}" --os-url $SERVICE_ENDPOINT -f csv | tail -n +2 | awk -F, '{print $2}' | grep heat_stack_user || keystone role-create --name heat_stack_user
-
-exec /usr/bin/heat-api
+../../../../common/heat/heat-api/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/heat/heat-base/config-heat.sh b/docker/centos/binary/heat/heat-base/config-heat.sh
index 74b2718a4..8b4e89797 100755..120000
--- a/docker/centos/binary/heat/heat-base/config-heat.sh
+++ b/docker/centos/binary/heat/heat-base/config-heat.sh
@@ -1,67 +1 @@
-#!/bin/bash
-
-set -e
-
-. /opt/kolla/kolla-common.sh
-
-: ${ADMIN_TENANT_NAME:=admin}
-: ${HEAT_DB_NAME:=heat}
-: ${HEAT_DB_USER:=heat}
-: ${HEAT_KEYSTONE_USER:=heat}
-: ${HEAT_CFN_KEYSTONE_USER:=heat_cfn}
-: ${KEYSTONE_AUTH_PROTOCOL:=http}
-: ${PUBLIC_IP:=$HEAT_API_PORT_8004_TCP_ADDR}
-: ${RABBIT_USER:=guest}
-: ${RABBIT_PASSWORD:=guest}
-
-check_required_vars HEAT_DB_PASSWORD HEAT_KEYSTONE_PASSWORD \
- KEYSTONE_PUBLIC_SERVICE_HOST RABBITMQ_SERVICE_HOST
-
-fail_unless_db
-dump_vars
-
-cat > /openrc <<EOF
-export OS_AUTH_URL="http://${KEYSTONE_PUBLIC_SERVICE_HOST}:5000/v2.0"
-export OS_USERNAME="${HEAT_KEYSTONE_USER}"
-export OS_PASSWORD="${HEAT_KEYSTONE_PASSWORD}"
-export OS_TENANT_NAME="${ADMIN_TENANT_NAME}"
-EOF
-
-crudini --set /etc/heat/heat.conf DEFAULT log_file \
- ""
-crudini --set /etc/heat/heat.conf DEFAULT use_stderr \
- true
-crudini --set /etc/heat/heat.conf DEFAULT rpc_backend \
- heat.openstack.common.rpc.impl_kombu
-crudini --set /etc/heat/heat.conf DEFAULT rabbit_host \
- "${RABBITMQ_SERVICE_HOST}"
-crudini --set /etc/heat/heat.conf DEFAULT rabbit_userid \
- "${RABBIT_USER}"
-crudini --set /etc/heat/heat.conf DEFAULT rabbit_password \
- "${RABBIT_PASSWORD}"
-
-crudini --set /etc/heat/heat.conf database connection \
- mysql://${HEAT_DB_USER}:${HEAT_DB_PASSWORD}@${MARIADB_SERVICE_HOST}/${HEAT_DB_NAME}
-
-crudini --set /etc/heat/heat.conf keystone_authtoken auth_protocol \
- "${KEYSTONE_AUTH_PROTOCOL}"
-crudini --set /etc/heat/heat.conf keystone_authtoken auth_host \
- "${KEYSTONE_PUBLIC_SERVICE_HOST}"
-crudini --set /etc/heat/heat.conf keystone_authtoken auth_port \
- "${KEYSTONE_PUBLIC_SERVICE_PORT}"
-crudini --set /etc/heat/heat.conf keystone_authtoken auth_uri \
- "${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_PUBLIC_SERVICE_HOST}:${KEYSTONE_PUBLIC_SERVICE_PORT}/v2.0"
-crudini --set /etc/heat/heat.conf keystone_authtoken admin_tenant_name \
- "${ADMIN_TENANT_NAME}"
-crudini --set /etc/heat/heat.conf keystone_authtoken admin_user \
- "${HEAT_KEYSTONE_USER}"
-crudini --set /etc/heat/heat.conf keystone_authtoken admin_password \
- "${HEAT_KEYSTONE_PASSWORD}"
-
-crudini --set /etc/heat/heat.conf ec2authtoken auth_uri \
- "${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_PUBLIC_SERVICE_HOST}:${KEYSTONE_PUBLIC_SERVICE_PORT}/v2.0"
-
-crudini --set /etc/heat/heat.conf DEFAULT heat_metadata_server_url \
- http://${HEAT_API_CFN_URL_HOST}:${HEAT_API_CFN_SERVICE_PORT}
-crudini --set /etc/heat/heat.conf DEFAULT heat_waitcondition_server_url \
- http://${HEAT_API_CFN_URL_HOST}:${HEAT_API_CFN_SERVICE_PORT}/v1/waitcondition
+../../../../common/heat/heat-base/config-heat.sh \ No newline at end of file
diff --git a/docker/centos/binary/heat/heat-engine/start.sh b/docker/centos/binary/heat/heat-engine/start.sh
index 2dfc78e92..d660bc5d1 100755..120000
--- a/docker/centos/binary/heat/heat-engine/start.sh
+++ b/docker/centos/binary/heat/heat-engine/start.sh
@@ -1,17 +1 @@
-#!/bin/bash
-
-. /opt/kolla/kolla-common.sh
-. /opt/kolla/config-heat.sh
-
-check_required_vars HEAT_DB_NAME HEAT_DB_USER HEAT_DB_PASSWORD
-fail_unless_db
-
-mysql -h ${MARIADB_SERVICE_HOST} -u root -p${DB_ROOT_PASSWORD} mysql <<EOF
-CREATE DATABASE IF NOT EXISTS ${HEAT_DB_NAME} DEFAULT CHARACTER SET utf8;
-GRANT ALL PRIVILEGES ON ${HEAT_DB_NAME}.* TO
- '${HEAT_DB_USER}'@'%' IDENTIFIED BY '${HEAT_DB_PASSWORD}'
-EOF
-
-/usr/bin/heat-manage db_sync
-
-exec /usr/bin/heat-engine
+../../../../common/heat/heat-engine/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/horizon/start.sh b/docker/centos/binary/horizon/start.sh
index 4e720bb87..3c793e4f9 100755..120000
--- a/docker/centos/binary/horizon/start.sh
+++ b/docker/centos/binary/horizon/start.sh
@@ -1,36 +1 @@
-#!/bin/bash
-set -e
-
-: ${HORIZON_KEYSTONE_USER:=horizon}
-
-. /opt/kolla/kolla-common.sh
-
-fail_unless_os_service_running keystone
-fail_unless_os_service_running glance
-fail_unless_os_service_running nova
-
-export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
-export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:35357/v2.0"
-
-cfg=/etc/openstack-dashboard/local_settings
-httpdcfg=/etc/httpd/conf.d/openstack-dashboard.conf
-
-sed -ri 's/ALLOWED_HOSTS = \['\''horizon.example.com'\'', '\''localhost'\''\]/ALLOWED_HOSTS = \['\''*'\'', \]/' /etc/openstack-dashboard/local_settings
-
-sed -ri 's/OPENSTACK_KEYSTONE_URL = \"http:\/\/%s:5000\/v2.0\" % OPENSTACK_HOST/OPENSTACK_KEYSTONE_URL = \"http:\/\/'"$KEYSTONE_PUBLIC_SERVICE_HOST"':5000\/v2.0\"/' /etc/openstack-dashboard/local_settings
-
-sed -ri 's/OPENSTACK_HOST = \"127.0.0.1\"/OPENSTACK_HOST = \"'"$KEYSTONE_PUBLIC_SERVICE_HOST"'\" /' /etc/openstack-dashboard/local_settings
-
-# Make sure we launch horizon using the default value for WEBROOT, which is
-# '/'.
-sed -ri '/^WEBROOT =.+/d' $cfg
-sed -ri 's,^(WSGIScriptAlias) /dashboard (/usr/share/openstack-dashboard/openstack_dashboard/wsgi/django.wsgi),\1 / \2,' $httpdcfg
-sed -ri 's,^(Alias /dashboard)(/static /usr/share/openstack-dashboard/static),Alias \2,' $httpdcfg
-
-# This step is required because of:
-# https://bugzilla.redhat.com/show_bug.cgi?id=1220070
-# Running this in the Dockerfile didn't fix the HTTP/500 as a result of the
-# missing compress action.
-python /usr/share/openstack-dashboard/manage.py compress
-
-/usr/sbin/httpd -DFOREGROUND
+../../../common/horizon/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/keystone/check.sh b/docker/centos/binary/keystone/check.sh
index ca4844784..fe8e7608c 100755..120000
--- a/docker/centos/binary/keystone/check.sh
+++ b/docker/centos/binary/keystone/check.sh
@@ -1,12 +1 @@
-#!/bin/bash
-
-RES=0
-
-. /openrc
-if ! keystone token-get > /dev/null; then
- echo "ERROR: keystone token-get failed" >&2
- RES=1
-fi
-
-exit $RES
-
+../../../common/keystone/check.sh \ No newline at end of file
diff --git a/docker/centos/binary/keystone/start.sh b/docker/centos/binary/keystone/start.sh
index 6dfebe060..ae34844ea 100755..120000
--- a/docker/centos/binary/keystone/start.sh
+++ b/docker/centos/binary/keystone/start.sh
@@ -1,162 +1 @@
-#!/bin/bash
-
-set -e
-
-# Run Kolla common script
-echo "Running the kolla-common script"
-. /opt/kolla/kolla-common.sh
-
-# Credentials, token, etc..
-: ${ADMIN_USER:=admin}
-: ${ADMIN_USER_PASSWORD:=password}
-: ${ADMIN_TENANT_NAME:=admin}
-: ${KEYSTONE_USER:=keystone}
-: ${KEYSTONE_ADMIN_PASSWORD:=password}
-: ${KEYSTONE_ADMIN_TOKEN:=changeme}
-# DB Settings
-: ${INIT_DB:=true}
-: ${KEYSTONE_DB_NAME:=keystone}
-: ${KEYSTONE_DB_USER:=keystone}
-: ${DB_ROOT_PASSWORD:=password}
-: ${MARIADB_SERVICE_HOST:=$PUBLIC_IP}
-: ${KEYSTONE_DB_PASSWORD:=password}
-# Service Addresses/Ports/Version
-: ${KEYSTONE_PUBLIC_SERVICE_HOST:=$PUBLIC_IP}
-: ${KEYSTONE_ADMIN_SERVICE_HOST:=$PUBLIC_IP}
-: ${KEYSTONE_PUBLIC_SERVICE_PORT:=5000}
-: ${KEYSTONE_ADMIN_SERVICE_PORT:=35357}
-: ${KEYSTONE_API_VERSION:=2.0}
-# Logging
-: ${LOG_FILE:=/var/log/keystone/keystone.log}
-: ${VERBOSE_LOGGING:=true}
-: ${DEBUG_LOGGING:=false}
-: ${USE_STDERR:=false}
-# Token provider, driver, etc..
-: ${TOKEN_PROVIDER:=uuid}
-: ${TOKEN_DRIVER:=sql}
-
-## Check DB connectivity and required variables
-echo "Checking connectivity to the DB"
-fail_unless_db
-echo "Checking for required variables"
-check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_DB_PASSWORD \
- KEYSTONE_ADMIN_PASSWORD ADMIN_TENANT_NAME \
- KEYSTONE_PUBLIC_SERVICE_HOST KEYSTONE_ADMIN_SERVICE_HOST \
- PUBLIC_IP
-dump_vars
-
-# Setup the Keystone DB
-echo "Setting up Keystone DB"
-mysql -h ${MARIADB_SERVICE_HOST} -u root -p"${DB_ROOT_PASSWORD}" mysql <<EOF
-CREATE DATABASE IF NOT EXISTS ${KEYSTONE_DB_NAME};
-GRANT ALL PRIVILEGES ON ${KEYSTONE_DB_NAME}.* TO
- '${KEYSTONE_DB_USER}'@'%' IDENTIFIED BY '${KEYSTONE_DB_PASSWORD}'
-EOF
-
-# File path and name used by crudini tool
-cfg=/etc/keystone/keystone.conf
-
-# Token Configuration
-echo "Configuring keystone.conf"
-crudini --set $cfg \
- DEFAULT \
- admin_token \
- "${KEYSTONE_ADMIN_TOKEN}"
-
-# Database Configuration
-crudini --set $cfg \
- database \
- connection \
- "mysql://${KEYSTONE_DB_USER}:${KEYSTONE_DB_PASSWORD}@${MARIADB_SERVICE_HOST}/${KEYSTONE_DB_NAME}"
-
-# Logging
-crudini --del $cfg \
- DEFAULT \
- log_dir
-crudini --set $cfg \
- DEFAULT \
- log_file \
- ${LOG_FILE}
-crudini --set $cfg \
- DEFAULT \
- verbose \
- ${VERBOSE_LOGGING}
-crudini --set $cfg \
- DEFAULT \
- debug \
- ${DEBUG_LOGGING}
-crudini --set $cfg \
- DEFAULT \
- use_stderr \
- ${USE_STDERR}
-
-# Token Management
-crudini --set $cfg \
- token \
- provider \
- keystone.token.providers."${TOKEN_PROVIDER}".Provider
-crudini --set $cfg \
- token \
- driver \
- keystone.token.persistence.backends."${TOKEN_DRIVER}".Token
-crudini --set $cfg \
- revoke \
- driver \
- keystone.contrib.revoke.backends."${TOKEN_DRIVER}".Revoke
-
-# Setup the openrc auth file
-cat > /openrc <<EOF
-export OS_AUTH_URL=http://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v${KEYSTONE_API_VERSION}
-export OS_USERNAME=${KEYSTONE_USER}
-export OS_PASSWORD=${KEYSTONE_ADMIN_PASSWORD}
-export OS_TENANT_NAME=${ADMIN_TENANT_NAME}
-EOF
-
-# Run PKI Setup script
-echo "Setting up PKI"
-/usr/bin/keystone-manage pki_setup --keystone-user keystone --keystone-group keystone
-
-# Fix permissions
-chown -R keystone:keystone /var/log/keystone
-chown -R keystone:keystone /etc/keystone/ssl
-chmod -R o-rwx /etc/keystone/ssl
-
-# Initialize the Keystone DB
-echo "Initializing Keystone DB"
-if [ "${INIT_DB}" == "true" ] ; then
- su -s /bin/bash -c "keystone-manage db_sync" keystone
-fi
-
-# Start Keystone
-echo "Starting Keystone"
-/usr/bin/keystone-all &
-PID=$!
-
-# Export Keystone service environment variables
-export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
-export SERVICE_ENDPOINT="http://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v${KEYSTONE_API_VERSION}"
-
-# Check to make sure the service is running
-echo "Verifying Keystone is running"
-while ! curl -o /dev/null -s --fail ${SERVICE_ENDPOINT}; do
- echo "waiting for Keystone @ ${SERVICE_ENDPOINT}"
- sleep 1;
-done
-echo "keystone is active @ ${SERVICE_ENDPOINT}"
-
-# Create Keystone tenant, user, role, service and endpoints
-echo "Creating Keystone tenant, user, role, service and endpoints"
-crux user-create --update \
- -n ${ADMIN_USER} -p "${ADMIN_USER_PASSWORD}" \
- -t ${ADMIN_TENANT_NAME} -r admin
-crux user-create --update \
- -n ${KEYSTONE_USER} -p "${KEYSTONE_ADMIN_PASSWORD}" \
- -t ${ADMIN_TENANT_NAME} -r admin
-crux endpoint-create --remove-all \
- -n keystone -t identity \
- -I "http://${KEYSTONE_PUBLIC_SERVICE_HOST}:${KEYSTONE_PUBLIC_SERVICE_PORT}/v${KEYSTONE_API_VERSION}" \
- -A "http://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v${KEYSTONE_API_VERSION}" \
- -P "http://${KEYSTONE_PUBLIC_SERVICE_HOST}:${KEYSTONE_PUBLIC_SERVICE_PORT}/v${KEYSTONE_API_VERSION}"
-
-# Wait on all jobs to exit before proceeding (see man wait)
-wait
+../../../common/keystone/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/magnum/magnum-api/check.sh b/docker/centos/binary/magnum/magnum-api/check.sh
index ee03dc6d2..7464ba296 100755..120000
--- a/docker/centos/binary/magnum/magnum-api/check.sh
+++ b/docker/centos/binary/magnum/magnum-api/check.sh
@@ -1,16 +1 @@
-#!/bin/bash
-
-RES=0
-
-. /openrc
-if ! keystone token-get > /dev/null; then
- echo "ERROR: keystone token-get failed" >&2
- RES=1
-else
- if ! heat stack-list > /dev/null; then
- echo "ERROR: heat stack-list failed" >&2
- RES=1
- fi
-fi
-
-exit $RES
+../../../../common/magnum/magnum-api/check.sh \ No newline at end of file
diff --git a/docker/centos/binary/magnum/magnum-api/start.sh b/docker/centos/binary/magnum/magnum-api/start.sh
index 00a51b3cd..58cc9e37c 100755..120000
--- a/docker/centos/binary/magnum/magnum-api/start.sh
+++ b/docker/centos/binary/magnum/magnum-api/start.sh
@@ -1,27 +1 @@
-#!/bin/bash
-set -e
-
-. /opt/kolla/kolla-common.sh
-. /opt/kolla/config-magnum.sh
-
-check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
- MAGNUM_KEYSTONE_USER MAGNUM_KEYSTONE_PASSWORD \
- KEYSTONE_AUTH_PROTOCOL ADMIN_TENANT_NAME \
- MAGNUM_API_SERVICE_HOST KEYSTONE_ADMIN_SERVICE_PORT \
- MAGNUM_API_SERVICE_PORT
-
-fail_unless_os_service_running keystone
-
-export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
-export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v2.0"
-crux user-create -n ${MAGNUM_KEYSTONE_USER} \
- -p ${MAGNUM_KEYSTONE_PASSWORD} \
- -t ${ADMIN_TENANT_NAME} \
- -r admin
-
-crux endpoint-create --remove-all -n ${MAGNUM_KEYSTONE_USER} -t container \
- -I "${KEYSTONE_AUTH_PROTOCOL}://${MAGNUM_API_SERVICE_HOST}:${MAGNUM_API_SERVICE_PORT}/v1" \
- -P "${KEYSTONE_AUTH_PROTOCOL}://${MAGNUM_API_SERVICE_HOST}:${MAGNUM_API_SERVICE_PORT}/v1" \
- -A "${KEYSTONE_AUTH_PROTOCOL}://${MAGNUM_API_SERVICE_HOST}:${MAGNUM_API_SERVICE_PORT}/v1"
-
-exec /usr/bin/magnum-api
+../../../../common/magnum/magnum-api/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/magnum/magnum-base/config-magnum.sh b/docker/centos/binary/magnum/magnum-base/config-magnum.sh
index 03599d359..473c0be8e 100755..120000
--- a/docker/centos/binary/magnum/magnum-base/config-magnum.sh
+++ b/docker/centos/binary/magnum/magnum-base/config-magnum.sh
@@ -1,46 +1 @@
-#!/bin/bash
-
-set -e
-
-. /opt/kolla/kolla-common.sh
-
-check_required_vars MAGNUM_DB_PASSWORD MAGNUM_KEYSTONE_PASSWORD \
- KEYSTONE_PUBLIC_SERVICE_HOST KEYSTONE_PUBLIC_SERVICE_PORT \
- MAGNUM_KEYSTONE_USER ADMIN_TENANT_NAME \
- MAGNUM_DB_USER MAGNUM_DB_NAME KEYSTONE_AUTH_PROTOCOL \
- KEYSTONE_PUBLIC_SERVICE_PORT RABBITMQ_SERVICE_HOST \
- VERBOSE_LOGGING DEBUG_LOGGING
-
-fail_unless_db
-dump_vars
-
-cat > /openrc <<EOF
-export OS_AUTH_URL="http://${KEYSTONE_PUBLIC_SERVICE_HOST}:${KEYSTONE_PUBLIC_SERVICE_PORT}/v2.0"
-export OS_USERNAME="${MAGNUM_KEYSTONE_USER}"
-export OS_PASSWORD="${MAGNUM_KEYSTONE_PASSWORD}"
-export OS_TENANT_NAME="${ADMIN_TENANT_NAME}"
-EOF
-
-cfg=/etc/magnum/magnum.conf
-
-crudini --set $cfg DEFAULT log_file ""
-crudini --set $cfg DEFAULT verbose "${VERBOSE_LOGGING}"
-crudini --set $cfg DEFAULT debug "${DEBUG_LOGGING}"
-crudini --set $cfg DEFAULT use_stderr true
-crudini --set $cfg DEFAULT rpc_backend magnum.openstack.common.rpc.impl_kombu
-crudini --set $cfg DEFAULT admin_user admin
-crudini --set $cfg oslo_messaging_rabbit rabbit_host ${RABBITMQ_SERVICE_HOST}
-crudini --set $cfg oslo_messaging_rabbit rabbit_userid ${RABBIT_USER}
-crudini --set $cfg oslo_messaging_rabbit rabbit_password ${RABBIT_PASSWORD}
-crudini --set $cfg database connection \
- mysql://${MAGNUM_DB_USER}:${MAGNUM_DB_PASSWORD}@${MARIADB_SERVICE_HOST}/${MAGNUM_DB_NAME}
-crudini --set $cfg keystone_authtoken auth_protocol "${KEYSTONE_AUTH_PROTOCOL}"
-crudini --set $cfg keystone_authtoken auth_host "${KEYSTONE_PUBLIC_SERVICE_HOST}"
-crudini --set $cfg keystone_authtoken auth_port "${KEYSTONE_PUBLIC_SERVICE_PORT}"
-crudini --set $cfg keystone_authtoken auth_uri \
- "${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_PUBLIC_SERVICE_HOST}:${KEYSTONE_PUBLIC_SERVICE_PORT}/v2.0"
-crudini --set $cfg keystone_authtoken admin_tenant_name "${ADMIN_TENANT_NAME}"
-crudini --set $cfg keystone_authtoken admin_user "${MAGNUM_KEYSTONE_USER}"
-crudini --set $cfg keystone_authtoken admin_password \
- "${MAGNUM_KEYSTONE_PASSWORD}"
-crudini --set $cfg api host ${MAGNUM_API_SERVICE_HOST}
+../../../../common/magnum/magnum-base/config-magnum.sh \ No newline at end of file
diff --git a/docker/centos/binary/magnum/magnum-conductor/start.sh b/docker/centos/binary/magnum/magnum-conductor/start.sh
index 4cf1291a3..681863036 100755..120000
--- a/docker/centos/binary/magnum/magnum-conductor/start.sh
+++ b/docker/centos/binary/magnum/magnum-conductor/start.sh
@@ -1,17 +1 @@
-#!/bin/bash
-
-. /opt/kolla/kolla-common.sh
-. /opt/kolla/config-magnum.sh
-
-check_required_vars MAGNUM_DB_NAME MAGNUM_DB_USER MAGNUM_DB_PASSWORD
-fail_unless_db
-
-mysql -h ${MARIADB_SERVICE_HOST} -u root -p${DB_ROOT_PASSWORD} mysql <<EOF
-CREATE DATABASE IF NOT EXISTS ${MAGNUM_DB_NAME} DEFAULT CHARACTER SET utf8;
-GRANT ALL PRIVILEGES ON ${MAGNUM_DB_NAME}.* TO
- '${MAGNUM_DB_USER}'@'%' IDENTIFIED BY '${MAGNUM_DB_PASSWORD}'
-EOF
-
-/usr/bin/magnum-db-manage upgrade
-
-exec /usr/bin/magnum-conductor
+../../../../common/magnum/magnum-conductor/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/mariadb-app/config-mysql.sh b/docker/centos/binary/mariadb-app/config-mysql.sh
index b11939b8b..17341e415 100755..120000
--- a/docker/centos/binary/mariadb-app/config-mysql.sh
+++ b/docker/centos/binary/mariadb-app/config-mysql.sh
@@ -1,24 +1 @@
-#!/bin/bash
-
-. /opt/kolla/kolla-common.sh
-
-: ${BIND_ADDRESS:=$PUBLIC_IP}
-: ${DB_ROOT_PASSWORD:=$DB_ROOT_PASSWORD}
-: ${DEFAULT_STORAGE_ENGINE:=innodb}
-: ${COLLATION_SERVER:=utf8_general_ci}
-: ${INIT_CONNECT:=SET NAMES utf8}
-: ${CHAR_SET_SERVER:=utf8}
-: ${INNODB_FILE_PER_TABLE:=true}
-: ${DATADIR:=/var/lib/mysql}
-: ${TEMP_FILE:='/tmp/mysql-first-time.sql'}
-
-server_cnf=/etc/my.cnf.d/server.cnf
-
-crudini --set $server_cnf mysqld bind-address $BIND_ADDRESS
-crudini --set $server_cnf mysqld default-storage-engine $DEFAULT_STORAGE_ENGINE
-crudini --set $server_cnf mysqld collation-server $COLLATION_SERVER
-crudini --set $server_cnf mysqld init-connect "'${INIT_CONNECT}'"
-crudini --set $server_cnf mysqld character-set-server $CHAR_SET_SERVER
-if [ "${INNODB_FILE_PER_TABLE}" == "true" ] || ["${INNODB_FILE_PER_TABLE}" == "True" ] ; then
- crudini --set $server_cnf mysqld innodb_file_per_table 1
-fi
+../../../common/mariadb-app/config-mysql.sh \ No newline at end of file
diff --git a/docker/centos/binary/neutron/neutron-agents/check-scripts/check-dhcp-agent.sh b/docker/centos/binary/neutron/neutron-agents/check-scripts/check-dhcp-agent.sh
index 7dda736ef..fcce4f251 100755..120000
--- a/docker/centos/binary/neutron/neutron-agents/check-scripts/check-dhcp-agent.sh
+++ b/docker/centos/binary/neutron/neutron-agents/check-scripts/check-dhcp-agent.sh
@@ -1,13 +1 @@
-#!/bin/bash
-
-RES=0
-
-check=$(/usr/bin/neutron agent-list | awk '/ DHCP / {print $9}')
-error="ERROR: Neutron DHCP Agent is not alive."
-
-if [[ $check != ":-)" ]]; then
- echo $error >&2
- RES=1
-fi
-
-exit $RES
+../../../../../common/neutron/neutron-agents/check-scripts/check-dhcp-agent.sh \ No newline at end of file
diff --git a/docker/centos/binary/neutron/neutron-agents/check-scripts/check-l3-agent.sh b/docker/centos/binary/neutron/neutron-agents/check-scripts/check-l3-agent.sh
index d32c1e272..3975d06b6 100755..120000
--- a/docker/centos/binary/neutron/neutron-agents/check-scripts/check-l3-agent.sh
+++ b/docker/centos/binary/neutron/neutron-agents/check-scripts/check-l3-agent.sh
@@ -1,13 +1 @@
-#!/bin/bash
-
-RES=0
-
-check=$(/usr/bin/neutron agent-list | awk '/ L3 / {print $9}')
-error="ERROR: Neutron L3 Agent is not alive."
-
-if [[ $check != ":-)" ]]; then
- echo $error >&2
- RES=1
-fi
-
-exit $RES
+../../../../../common/neutron/neutron-agents/check-scripts/check-l3-agent.sh \ No newline at end of file
diff --git a/docker/centos/binary/neutron/neutron-agents/check-scripts/check-linuxbridge-agent.sh b/docker/centos/binary/neutron/neutron-agents/check-scripts/check-linuxbridge-agent.sh
index 4485fc1ec..8f26a18fe 100755..120000
--- a/docker/centos/binary/neutron/neutron-agents/check-scripts/check-linuxbridge-agent.sh
+++ b/docker/centos/binary/neutron/neutron-agents/check-scripts/check-linuxbridge-agent.sh
@@ -1,13 +1 @@
-#!/bin/bash
-
-RES=0
-
-check=$(/usr/bin/neutron agent-list | awk '/ Linux / {print $10}')
-error="ERROR: Neutron Linux Bridge agent is not alive."
-
-if [[ $check != ":-)" ]]; then
- echo $error >&2
- RES=1
-fi
-
-exit $RES
+../../../../../common/neutron/neutron-agents/check-scripts/check-linuxbridge-agent.sh \ No newline at end of file
diff --git a/docker/centos/binary/neutron/neutron-agents/check-scripts/check-metadata-agent.sh b/docker/centos/binary/neutron/neutron-agents/check-scripts/check-metadata-agent.sh
index fd1c6812b..aabb2a9ee 100755..120000
--- a/docker/centos/binary/neutron/neutron-agents/check-scripts/check-metadata-agent.sh
+++ b/docker/centos/binary/neutron/neutron-agents/check-scripts/check-metadata-agent.sh
@@ -1,13 +1 @@
-#!/bin/bash
-
-RES=0
-
-check=$(/usr/bin/neutron agent-list | awk '/ Metadata / {print $9}')
-error="ERROR: Neutron Metadata Agent is not alive."
-
-if [[ $check != ":-)" ]]; then
- echo $error >&2
- RES=1
-fi
-
-exit $RES
+../../../../../common/neutron/neutron-agents/check-scripts/check-metadata-agent.sh \ No newline at end of file
diff --git a/docker/centos/binary/neutron/neutron-agents/config-scripts/config-dhcp-agent.sh b/docker/centos/binary/neutron/neutron-agents/config-scripts/config-dhcp-agent.sh
index db71678b1..8ef8dec06 100755..120000
--- a/docker/centos/binary/neutron/neutron-agents/config-scripts/config-dhcp-agent.sh
+++ b/docker/centos/binary/neutron/neutron-agents/config-scripts/config-dhcp-agent.sh
@@ -1,88 +1 @@
-#!/bin/bash
-
-set -e
-
-. /opt/kolla/config-neutron.sh
-. /opt/kolla/config-sudoers.sh
-
-: ${DHCP_DRIVER:=neutron.agent.linux.dhcp.Dnsmasq}
-: ${USE_NAMESPACES:=true}
-: ${DELETE_NAMESPACES:=true}
-: ${DNSMASQ_CONFIG_FILE:=/etc/neutron/dnsmasq/dnsmasq-neutron.conf}
-: ${ROOT_HELPER:=sudo neutron-rootwrap /etc/neutron/rootwrap.conf}
-
-mkdir -p $(dirname $DNSMASQ_CONFIG_FILE)
-
-check_required_vars VERBOSE_LOGGING DEBUG_LOGGING MECHANISM_DRIVERS \
- DHCP_DRIVER USE_NAMESPACES DELETE_NAMESPACES \
- NEUTRON_LOG_DIR DNSMASQ_CONFIG_FILE \
-
-cfg=/etc/neutron/dhcp_agent.ini
-neutron_conf=/etc/neutron/neutron.conf
-
-# Workaround bug in dhclient in cirros images which does not correctly
-# handle setting checksums of packets when using hardware with checksum
-# offloading. See:
-# https://www.rdoproject.org/forum/discussion/567/packstack-allinone-grizzly-cirros-image-cannot-get-a-dhcp-address-when-a-centos-image-can/p1
-
-/usr/sbin/iptables -A POSTROUTING -t mangle -p udp --dport bootpc \
- -j CHECKSUM --checksum-fill
-
-if [[ ${MECHANISM_DRIVERS} =~ linuxbridge ]]; then
- interface_driver="neutron.agent.linux.interface.BridgeInterfaceDriver"
-elif [[ ${MECHANISM_DRIVERS} == "openvswitch" ]]; then
- interface_driver="neutron.agent.linux.interface.OVSInterfaceDriver"
-fi
-
-# Logging
-crudini --set $neutron_conf \
- DEFAULT \
- log_file \
- "${NEUTRON_DHCP_AGENT_LOG_FILE}"
-
-# Configure dhcp_agent.ini
-crudini --set $cfg \
- DEFAULT \
- verbose \
- "${VERBOSE_LOGGING}"
-crudini --set $cfg \
- DEFAULT \
- debug \
- "${DEBUG_LOGGING}"
-crudini --set $cfg \
- DEFAULT \
- interface_driver \
- "$interface_driver"
-crudini --set $cfg \
- DEFAULT \
- dhcp_driver \
- "${DHCP_DRIVER}"
-crudini --set $cfg \
- DEFAULT \
- use_namespaces \
- "${USE_NAMESPACES}"
-crudini --set $cfg \
- DEFAULT \
- delete_namespaces \
- "${DELETE_NAMESPACES}"
-crudini --set $cfg \
- DEFAULT \
- dnsmasq_config_file \
- "${DNSMASQ_CONFIG_FILE}"
-crudini --set $cfg \
- DEFAULT \
- root_helper \
- "${ROOT_HELPER}"
-
-cat > ${DNSMASQ_CONFIG_FILE} <<EOF
-dhcp-option-force=26,1450
-log-facility=${NEUTRON_LOG_DIR}/neutron-dnsmasq.log
-EOF
-
-# Remove any existing qdhcp namespaces
-ip netns list | grep qdhcp | while read -r line ; do
- ip netns delete $line
-done
-
-# Start DHCP Agent
-exec /usr/bin/neutron-dhcp-agent --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/dhcp_agent.ini --config-dir /etc/neutron
+../../../../../common/neutron/neutron-agents/config-scripts/config-dhcp-agent.sh \ No newline at end of file
diff --git a/docker/centos/binary/neutron/neutron-agents/config-scripts/config-l3-agent.sh b/docker/centos/binary/neutron/neutron-agents/config-scripts/config-l3-agent.sh
index 761d07685..d92fe01ec 100755..120000
--- a/docker/centos/binary/neutron/neutron-agents/config-scripts/config-l3-agent.sh
+++ b/docker/centos/binary/neutron/neutron-agents/config-scripts/config-l3-agent.sh
@@ -1,85 +1 @@
-#!/bin/bash
-
-set -e
-
-. /opt/kolla/config-neutron.sh
-. /opt/kolla/config-sudoers.sh
-
-: ${USE_NAMESPACES:=true}
-
-check_required_vars VERBOSE_LOGGING DEBUG_LOGGING
-
-cfg=/etc/neutron/l3_agent.ini
-neutron_conf=/etc/neutron/neutron.conf
-
-# Logging
-crudini --set $neutron_conf \
- DEFAULT \
- log_file \
- "${NEUTRON_L3_AGENT_LOG_FILE}"
-
-# Configure l3_agent.ini
-crudini --set $cfg \
- DEFAULT \
- verbose \
- "${VERBOSE_LOGGING}"
-crudini --set $cfg \
- DEFAULT \
- debug \
- "${DEBUG_LOGGING}"
-if [[ "${MECHANISM_DRIVERS}" =~ linuxbridge ]] ; then
- crudini --set $cfg \
- DEFAULT \
- interface_driver \
- "neutron.agent.linux.interface.BridgeInterfaceDriver"
- crudini --set $cfg \
- DEFAULT \
- gateway_external_network_id \
- ""
- crudini --set $cfg \
- DEFAULT \
- external_network_bridge \
- ""
-elif [[ "${MECHANISM_DRIVERS}" =~ .*openvswitch* ]] ; then
- crudini --set $cfg \
- DEFAULT \
- interface_driver \
- "neutron.agent.linux.interface.OVSInterfaceDriver"
- crudini --set $cfg \
- DEFAULT \
- gateway_external_network_id \
- "${NEUTRON_FLAT_NETWORK_BRIDGE}"
- crudini --set $cfg \
- DEFAULT \
- external_network_bridge \
- "${NEUTRON_FLAT_NETWORK_BRIDGE}"
-fi
-
-crudini --set $cfg \
- DEFAULT \
- use_namespaces \
- "${USE_NAMESPACES}"
-
-if [ "${USE_NAMESPACES}" == "false" ] ; then
- source /openrc
- # Create router if it does not exist
- /usr/bin/neutron router-list | grep admin-router || /usr/bin/neutron router-create admin-router
- # Set router-id
- crudini --set $cfg \
- DEFAULT \
- router_id \
- "$(/usr/bin/neutron router-list | awk '/ admin-router / {print $2}')"
-elif [ "${USE_NAMESPACES}" == "true" ] ; then
- crudini --set $cfg \
- DEFAULT \
- router_delete_namespaces \
- "true"
-fi
-
-# Remove any existing qrouter namespaces
-ip netns list | grep qrouter | while read -r line ; do
- ip netns delete $line
-done
-
-# Start L3 Agent
-exec /usr/bin/neutron-l3-agent --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/l3_agent.ini --config-file /etc/neutron/fwaas_driver.ini --config-dir /etc/neutron
+../../../../../common/neutron/neutron-agents/config-scripts/config-l3-agent.sh \ No newline at end of file
diff --git a/docker/centos/binary/neutron/neutron-agents/config-scripts/config-linuxbridge-agent.sh b/docker/centos/binary/neutron/neutron-agents/config-scripts/config-linuxbridge-agent.sh
index bd8f90194..0736ca3ca 100755..120000
--- a/docker/centos/binary/neutron/neutron-agents/config-scripts/config-linuxbridge-agent.sh
+++ b/docker/centos/binary/neutron/neutron-agents/config-scripts/config-linuxbridge-agent.sh
@@ -1,29 +1 @@
-#!/bin/bash
-
-set -e
-
-. /opt/kolla/config-neutron.sh
-. /opt/kolla/config-sudoers.sh
-
-: ${NEUTRON_FLAT_NETWORK_NAME:=physnet1}
-: ${NEUTRON_FLAT_NETWORK_INTERFACE:=eth1}
-
-check_required_vars PUBLIC_IP NEUTRON_FLAT_NETWORK_NAME \
- NEUTRON_FLAT_NETWORK_INTERFACE
-
-cfg=/etc/neutron/plugins/ml2/ml2_conf.ini
-
-# Configure ml2_conf.ini
-if [[ ${TYPE_DRIVERS} =~ vxlan ]]; then
- crudini --set $cfg \
- vxlan \
- local_ip \
- "${PUBLIC_IP}"
-fi
-
-crudini --set $cfg \
- linux_bridge \
- physical_interface_mappings \
- "${NEUTRON_FLAT_NETWORK_NAME}:${NEUTRON_FLAT_NETWORK_INTERFACE}"
-
-exec /usr/bin/neutron-linuxbridge-agent --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini --config-dir /etc/neutron
+../../../../../common/neutron/neutron-agents/config-scripts/config-linuxbridge-agent.sh \ No newline at end of file
diff --git a/docker/centos/binary/neutron/neutron-agents/config-scripts/config-metadata-agent.sh b/docker/centos/binary/neutron/neutron-agents/config-scripts/config-metadata-agent.sh
index d1eef341c..7e9c1b299 100755..120000
--- a/docker/centos/binary/neutron/neutron-agents/config-scripts/config-metadata-agent.sh
+++ b/docker/centos/binary/neutron/neutron-agents/config-scripts/config-metadata-agent.sh
@@ -1,74 +1 @@
-#!/bin/bash
-
-set -e
-
-. /opt/kolla/config-neutron.sh
-. /opt/kolla/config-sudoers.sh
-
-: ${KEYSTONE_REGION:=RegionOne}
-: ${ENDPOINT_TYPE:=adminURL}
-: ${NEUTRON_SHARED_SECRET:=sharedsecret}
-
-check_required_vars VERBOSE_LOGGING DEBUG_LOGGING KEYSTONE_AUTH_PROTOCOL \
- KEYSTONE_PUBLIC_SERVICE_HOST ADMIN_TENANT_NAME \
- NEUTRON_KEYSTONE_USER NEUTRON_KEYSTONE_PASSWORD \
- NEUTRON_SHARED_SECRET NOVA_METADATA_API_SERVICE_HOST \
- NOVA_METADATA_API_SERVICE_PORT
-
-cfg=/etc/neutron/metadata_agent.ini
-neutron_conf=/etc/neutron/neutron.conf
-
-# Logging
-crudini --set $neutron_conf \
- DEFAULT \
- log_file \
- "${NEUTRON_METADATA_AGENT_LOG_FILE}"
-
-# Configure metadata_agent.ini
-crudini --set $cfg \
- DEFAULT \
- verbose \
- "${VERBOSE_LOGGING}"
-crudini --set $cfg \
- DEFAULT \
- debug \
- "${DEBUG_LOGGING}"
-crudini --set $cfg \
- DEFAULT \
- auth_region \
- "${KEYSTONE_REGION}"
-crudini --set $cfg \
- DEFAULT \
- endpoint_type \
- "${ENDPOINT_TYPE}"
-crudini --set $cfg \
- DEFAULT \
- auth_url \
- "${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_PUBLIC_SERVICE_HOST}:${KEYSTONE_PUBLIC_SERVICE_PORT}/v2.0"
-crudini --set $cfg \
- DEFAULT \
- admin_tenant_name \
- "${ADMIN_TENANT_NAME}"
-crudini --set $cfg \
- DEFAULT \
- admin_user \
- "${NEUTRON_KEYSTONE_USER}"
-crudini --set $cfg \
- DEFAULT \
- admin_password \
- "${NEUTRON_KEYSTONE_PASSWORD}"
-crudini --set $cfg \
- DEFAULT \
- nova_metadata_ip \
- "${NOVA_METADATA_API_SERVICE_HOST}"
-crudini --set $cfg \
- DEFAULT \
- nova_metadata_port \
- "${NOVA_METADATA_API_SERVICE_PORT}"
-crudini --set $cfg \
- DEFAULT \
- metadata_proxy_shared_secret \
- "${NEUTRON_SHARED_SECRET}"
-
-# Start Metadata Agent
-exec /usr/bin/neutron-metadata-agent --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/metadata_agent.ini --config-dir /etc/neutron
+../../../../../common/neutron/neutron-agents/config-scripts/config-metadata-agent.sh \ No newline at end of file
diff --git a/docker/centos/binary/neutron/neutron-agents/config-scripts/config-sudoers.sh b/docker/centos/binary/neutron/neutron-agents/config-scripts/config-sudoers.sh
index 0e02226db..3ecc0c823 100755..120000
--- a/docker/centos/binary/neutron/neutron-agents/config-scripts/config-sudoers.sh
+++ b/docker/centos/binary/neutron/neutron-agents/config-scripts/config-sudoers.sh
@@ -1,12 +1 @@
-#!/bin/bash
-
-# Neutron uses rootwrap which requires a tty for sudo.
-# Since the container is running in daemon mode, a tty
-# is not present and requiretty must be commented out.
-if [ ! -f /var/run/sudo-modified ]; then
- chmod 0640 /etc/sudoers
- sed -i '/Defaults requiretty/s/^/#/' /etc/sudoers
- chmod 0440 /etc/sudoers
-fi
-
-touch /var/run/sudo-modified
+../../../../../common/neutron/neutron-agents/config-scripts/config-sudoers.sh \ No newline at end of file
diff --git a/docker/centos/binary/neutron/neutron-agents/fwaas_driver.ini b/docker/centos/binary/neutron/neutron-agents/fwaas_driver.ini
index 41f761abf..84e47b1c2 100644..120000
--- a/docker/centos/binary/neutron/neutron-agents/fwaas_driver.ini
+++ b/docker/centos/binary/neutron/neutron-agents/fwaas_driver.ini
@@ -1,3 +1 @@
-[fwaas]
-#driver = neutron.services.firewall.drivers.linux.iptables_fwaas.IptablesFwaasDriver
-#enabled = True
+../../../../common/neutron/neutron-agents/fwaas_driver.ini \ No newline at end of file
diff --git a/docker/centos/binary/neutron/neutron-agents/supervisord.conf b/docker/centos/binary/neutron/neutron-agents/supervisord.conf
index 7455cb3d7..a7f24cb77 100644..120000
--- a/docker/centos/binary/neutron/neutron-agents/supervisord.conf
+++ b/docker/centos/binary/neutron/neutron-agents/supervisord.conf
@@ -1,53 +1 @@
-[unix_http_server]
-file = /var/run/supervisor.sock
-
-[inet_http_server]
-port = 127.0.0.1:9001
-
-[supervisord]
-nodaemon=true
-logfile = /var/log/supervisor/supervisord.log
-logfile_maxbytes = 200KB
-logfile_backups = 1
-pidfile = /var/run/supervisord.pid
-childlogdir = /var/log/supervisor
-
-[rpcinterface:supervisor]
-supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
-
-[supervisorctl]
-serverurl = unix:///var/run/supervisor.sock
-
-[program:neutron-linuxbridge-agent]
-command=/opt/kolla/neutron/config-linuxbridge-agent.sh
-priority=30
-startsec=10
-stderr_events_enabled=true
-stdout_events_enabled=true
-
-[program:neutron-dhcp-agent]
-command=/opt/kolla/neutron/config-dhcp-agent.sh
-priority=40
-startsec=10
-stderr_events_enabled=true
-stdout_events_enabled=true
-
-[program:neutron-metadata-agent]
-command=/opt/kolla/neutron/config-metadata-agent.sh
-priority=40
-startsec=10
-stderr_events_enabled=true
-stdout_events_enabled=true
-
-[program:neutron-l3-agent]
-command=/opt/kolla/neutron/config-l3-agent.sh
-priority=40
-startsec=10
-stderr_events_enabled=true
-stdout_events_enabled=true
-
-[eventlistener:stdout]
-command = supervisor_stdout
-buffer_size = 100
-events = PROCESS_LOG
-result_handler = supervisor_stdout:event_handler
+../../../../common/neutron/neutron-agents/supervisord.conf \ No newline at end of file
diff --git a/docker/centos/binary/neutron/neutron-base/config-neutron.sh b/docker/centos/binary/neutron/neutron-base/config-neutron.sh
index 015565105..0de598123 100644..120000
--- a/docker/centos/binary/neutron/neutron-base/config-neutron.sh
+++ b/docker/centos/binary/neutron/neutron-base/config-neutron.sh
@@ -1,210 +1 @@
-#!/bin/bash
-
-set -e
-
-. /opt/kolla/kolla-common.sh
-
-# Database
-: ${NEUTRON_DB_NAME:=neutron}
-: ${NEUTRON_DB_USER:=neutron}
-: ${NEUTRON_DB_PASSWORD:=password}
-# Keystone
-: ${ADMIN_TENANT_NAME:=admin}
-: ${NEUTRON_KEYSTONE_USER:=neutron}
-: ${NEUTRON_KEYSTONE_PASSWORD:=password}
-: ${KEYSTONE_AUTH_PROTOCOL:=http}
-: ${KEYSTONE_ADMIN_SERVICE_HOST:=127.0.0.1}
-: ${KEYSTONE_PUBLIC_SERVICE_HOST:=127.0.0.1}
-: ${KEYSTONE_ADMIN_SERVICE_PORT:=35357}
-: ${KEYSTONE_PUBLIC_SERVICE_PORT:=5000}
-: ${KEYSTONE_REGION:=RegionOne}
-# RabbitMQ
-: ${RABBIT_HOST:=$RABBITMQ_SERVICE_HOST}
-: ${RABBIT_USER:=guest}
-: ${RABBIT_PASSWORD:=guest}
-# Logging
-: ${VERBOSE_LOGGING:=true}
-: ${DEBUG_LOGGING:=false}
-# Networking
-: ${NEUTRON_FLAT_NETWORK_NAME:=physnet1}
-# Paste configuration file
-: ${API_PASTE_CONFIG:=/usr/share/neutron/api-paste.ini}
-
-check_required_vars NEUTRON_KEYSTONE_PASSWORD NEUTRON_API_PASTE_CONFIG \
- KEYSTONE_PUBLIC_SERVICE_HOST RABBITMQ_SERVICE_HOST
-
-core_cfg=/etc/neutron/neutron.conf
-ml2_cfg=/etc/neutron/plugins/ml2/ml2_conf.ini
-
-# Logging
-crudini --set $core_cfg \
- DEFAULT \
- log_dir \
- "${NEUTRON_LOG_DIR}"
-crudini --set $core_cfg \
- DEFAULT \
- verbose \
- "${VERBOSE_LOGGING}"
-crudini --set $core_cfg \
- DEFAULT \
- debug \
- "${DEBUG_LOGGING}"
-
-# Paste config
-crudini --set $core_cfg \
- DEFAULT \
- api_paste_config \
- "${NEUTRON_API_PASTE_CONFIG}"
-
-# Rabbit
-crudini --set $core_cfg \
- DEFAULT \
- rabbit_host \
- "${RABBIT_HOST}"
-crudini --set $core_cfg \
- DEFAULT \
- rabbit_userid \
- "${RABBIT_USER}"
-crudini --set $core_cfg \
- DEFAULT \
- rabbit_password \
- "${RABBIT_PASSWORD}"
-
-# Locking
-crudini --set $core_cfg \
- DEFAULT \
- lock_path \
- "/var/lock/neutron"
-
-# Keystone
-crudini --set $core_cfg \
- DEFAULT \
- auth_strategy \
- "keystone"
-crudini --set $core_cfg \
- keystone_authtoken \
- auth_uri \
- "${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_PUBLIC_SERVICE_HOST}:${KEYSTONE_PUBLIC_SERVICE_PORT}/v2.0"
-crudini --set $core_cfg \
- keystone_authtoken \
- identity_uri \
- "${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}"
-crudini --set $core_cfg \
- keystone_authtoken \
- admin_tenant_name \
- "${ADMIN_TENANT_NAME}"
-crudini --set $core_cfg \
- keystone_authtoken \
- admin_user \
- "${NEUTRON_KEYSTONE_USER}"
-crudini --set $core_cfg \
- keystone_authtoken \
- admin_password \
- "${NEUTRON_KEYSTONE_PASSWORD}"
-
-# Rootwrap
-crudini --set $core_cfg \
- agent \
- root_helper \
- "sudo neutron-rootwrap /etc/neutron/rootwrap.conf"
-
-# neutron.conf ml2 configuration
-crudini --set $core_cfg \
- DEFAULT \
- core_plugin \
- "neutron.plugins.ml2.plugin.Ml2Plugin"
-crudini --set $core_cfg \
- DEFAULT \
- service_plugins \
- "neutron.services.l3_router.l3_router_plugin.L3RouterPlugin"
-crudini --set $core_cfg \
- DEFAULT \
- allow_overlapping_ips \
- "True"
-
-# Configure ml2_conf.ini
-crudini --set $ml2_cfg \
- ml2 \
- type_drivers \
- "${TYPE_DRIVERS}"
-crudini --set $ml2_cfg \
- ml2 \
- tenant_network_types \
- "${TENANT_NETWORK_TYPES}"
-crudini --set $ml2_cfg \
- ml2 \
- mechanism_drivers \
- "${MECHANISM_DRIVERS}"
-
-if [[ ${TYPE_DRIVERS} =~ .*flat.* ]]; then
- crudini --set $ml2_cfg \
- ml2_type_flat \
- flat_networks \
- ${NEUTRON_FLAT_NETWORK_NAME}
-fi
-
-if [[ ${TYPE_DRIVERS} =~ .*vxlan.* ]]; then
- crudini --set $ml2_cfg \
- ml2_type_vxlan \
- vxlan_group \
- ""
- crudini --set $ml2_cfg \
- ml2_type_vxlan \
- vni_ranges \
- "1:1000"
- crudini --set $ml2_cfg \
- vxlan \
- enable_vxlan \
- "True"
- crudini --set $ml2_cfg \
- vxlan \
- vxlan_group \
- ""
- crudini --set $ml2_cfg \
- vxlan \
- l2_population \
- "True"
- crudini --set $ml2_cfg \
- agent \
- tunnel_types \
- "vxlan"
- crudini --set $ml2_cfg \
- agent \
- vxlan_udp_port \
- "4789"
- crudini --set $core_cfg \
- DEFAULT \
- network_device_mtu \
- "1450"
-fi
-
-crudini --set $ml2_cfg \
- l2pop \
- agent_boot_time \
- "180"
-crudini --set $ml2_cfg \
- securitygroup \
- enable_security_group \
- "True"
-crudini --set $ml2_cfg \
- securitygroup \
- enable_ipset \
- "True"
-
-if [[ ${MECHANISM_DRIVERS} =~ linuxbridge ]]; then
- firewall_driver="neutron.agent.linux.iptables_firewall.IptablesFirewallDriver"
-elif [[ ${MECHANISM_DRIVERS} == "openvswitch" ]]; then
- firewall_driver="neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver"
-fi
-
-crudini --set $ml2_cfg \
- securitygroup \
- firewall_driver \
- "$firewall_driver"
-
-cat > /openrc <<EOF
-export OS_AUTH_URL="http://${KEYSTONE_PUBLIC_SERVICE_HOST}:${KEYSTONE_PUBLIC_SERVICE_PORT}/v2.0"
-export OS_USERNAME="${NEUTRON_KEYSTONE_USER}"
-export OS_PASSWORD="${NEUTRON_KEYSTONE_PASSWORD}"
-export OS_TENANT_NAME="${ADMIN_TENANT_NAME}"
-EOF
+../../../../common/neutron/neutron-base/config-neutron.sh \ No newline at end of file
diff --git a/docker/centos/binary/neutron/neutron-server/check.sh b/docker/centos/binary/neutron/neutron-server/check.sh
index 4e9aa623c..001936616 100755..120000
--- a/docker/centos/binary/neutron/neutron-server/check.sh
+++ b/docker/centos/binary/neutron/neutron-server/check.sh
@@ -1,17 +1 @@
-#!/bin/bash
-
-RES=0
-
-. /openrc
-if ! keystone token-get > /dev/null; then
- echo "ERROR: keystone token-get failed" >&2
- RES=1
-else
- if ! neutron ext-list > /dev/null; then
- echo "ERROR: neutron ext-list failed" >&2
- RES=1
- fi
-fi
-
-exit $RES
-
+../../../../common/neutron/neutron-server/check.sh \ No newline at end of file
diff --git a/docker/centos/binary/neutron/neutron-server/start.sh b/docker/centos/binary/neutron/neutron-server/start.sh
index fb971083f..a11ea7703 100755..120000
--- a/docker/centos/binary/neutron/neutron-server/start.sh
+++ b/docker/centos/binary/neutron/neutron-server/start.sh
@@ -1,98 +1 @@
-#!/bin/bash
-
-set -e
-
-. /opt/kolla/config-neutron.sh
-
-: ${NEUTRON_FLAT_NETWORK_NAME:=physnet1}
-: ${NEUTRON_FLAT_NETWORK_INTERFACE:=eth1}
-
-check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
- KEYSTONE_AUTH_PROTOCOL NOVA_API_SERVICE_HOST \
- NOVA_KEYSTONE_USER NOVA_KEYSTONE_PASSWORD \
- NEUTRON_DB_NAME NEUTRON_DB_USER NEUTRON_DB_PASSWORD \
- NEUTRON_KEYSTONE_USER NEUTRON_KEYSTONE_PASSWORD \
- ADMIN_TENANT_NAME NEUTRON_SERVER_SERVICE_HOST \
- PUBLIC_IP NEUTRON_DB_PASSWORD
-fail_unless_os_service_running keystone
-fail_unless_db
-
-mysql -h ${MARIADB_SERVICE_HOST} -u root -p${DB_ROOT_PASSWORD} mysql <<EOF
-CREATE DATABASE IF NOT EXISTS ${NEUTRON_DB_NAME} DEFAULT CHARACTER SET utf8;
-GRANT ALL PRIVILEGES ON ${NEUTRON_DB_NAME}.* TO
- '${NEUTRON_DB_USER}'@'%' IDENTIFIED BY '${NEUTRON_DB_PASSWORD}'
-
-EOF
-
-export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
-export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v2.0"
-
-# Configure Keystone Service Catalog
-crux user-create -n "${NEUTRON_KEYSTONE_USER}" \
- -p "${NEUTRON_KEYSTONE_PASSWORD}" \
- -t "${ADMIN_TENANT_NAME}" \
- -r admin
-
-crux endpoint-create -n neutron -t network \
- -I "${KEYSTONE_AUTH_PROTOCOL}://${NEUTRON_SERVER_SERVICE_HOST}:${NEUTRON_SERVER_SERVICE_PORT}" \
- -P "${KEYSTONE_AUTH_PROTOCOL}://${NEUTRON_SERVER_SERVICE_HOST}:${NEUTRON_SERVER_SERVICE_PORT}" \
- -A "${KEYSTONE_AUTH_PROTOCOL}://${NEUTRON_SERVER_SERVICE_HOST}:${NEUTRON_SERVER_SERVICE_PORT}"
-
-core_cfg=/etc/neutron/neutron.conf
-ml2_cfg=/etc/neutron/plugins/ml2/ml2_conf.ini
-
-# Logging
-crudini --set /etc/neutron/neutron.conf \
- DEFAULT \
- log_file \
- "${NEUTRON_SERVER_LOG_FILE}"
-
-# Database
-crudini --set $core_cfg \
- database \
- connection \
- "mysql://${NEUTRON_DB_USER}:${NEUTRON_DB_PASSWORD}@${MARIADB_SERVICE_HOST}/${NEUTRON_DB_NAME}"
-# Nova
-crudini --set $core_cfg \
- DEFAULT \
- notify_nova_on_port_status_changes \
- "True"
-crudini --set $core_cfg \
- DEFAULT \
- notify_nova_on_port_data_changes \
- "True"
-crudini --set $core_cfg \
- DEFAULT \
- nova_url \
- "http://${NOVA_API_SERVICE_HOST}:${NOVA_API_SERVICE_PORT}/v2"
-crudini --set $core_cfg \
- DEFAULT \
- nova_admin_auth_url \
- "${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v2.0"
-crudini --set $core_cfg \
- DEFAULT \
- nova_region_name \
- "${KEYSTONE_REGION}"
-crudini --set $core_cfg \
- DEFAULT \
- nova_admin_username \
- "${NOVA_KEYSTONE_USER}"
-crudini --set $core_cfg \
- DEFAULT \
- nova_admin_tenant_id \
- "$(keystone tenant-list | grep $ADMIN_TENANT_NAME | awk '{print $2;}')"
-crudini --set $core_cfg \
- DEFAULT \
- nova_admin_password \
- "${NOVA_KEYSTONE_PASSWORD}"
-
-if [[ ${MECHANISM_DRIVERS} =~ linuxbridge ]]; then
- crudini --set $ml2_cfg \
- linux_bridge \
- physical_interface_mappings \
- "${NEUTRON_FLAT_NETWORK_NAME}:${NEUTRON_FLAT_NETWORK_INTERFACE}"
-fi
-
-su -s /bin/bash -c "neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron
-
-exec /usr/bin/neutron-server --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini
+../../../../common/neutron/neutron-server/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/nova-base/config-nova.sh b/docker/centos/binary/nova-base/config-nova.sh
index 8789a14a5..32efe6056 100755..120000
--- a/docker/centos/binary/nova-base/config-nova.sh
+++ b/docker/centos/binary/nova-base/config-nova.sh
@@ -1,137 +1 @@
-#!/bin/bash
-
-. /opt/kolla/kolla-common.sh
-
-: ${NOVA_DB_USER:=nova}
-: ${NOVA_DB_NAME:=nova}
-: ${NOVA_KEYSTONE_USER:=admin}
-: ${NOVA_KEYSTONE_PASSWORD:=kolla}
-: ${ADMIN_TENANT_NAME:=admin}
-: ${RABBIT_USERID:=guest}
-: ${RABBIT_PASSWORD:=guest}
-: ${NETWORK_MANAGER:=nova}
-: ${FLAT_NETWORK:=eth1}
-: ${PUBLIC_NETWORK:=eth0}
-: ${ENABLED_APIS:=ec2,osapi_compute,metadata}
-: ${METADATA_HOST:=$PUBLIC_IP}
-: ${NEUTRON_SHARED_SECRET:=sharedsecret}
-
-check_required_vars KEYSTONE_ADMIN_TOKEN NOVA_DB_PASSWORD \
- RABBITMQ_SERVICE_HOST GLANCE_API_SERVICE_HOST \
- KEYSTONE_PUBLIC_SERVICE_HOST PUBLIC_IP \
- PUBLIC_INTERFACE FLAT_INTERFACE DEBUG_LOGGING \
- VERBOSE_LOGGING
-
-cfg=/etc/nova/nova.conf
-
-crudini --set $cfg DEFAULT amqp_durable_queues False
-crudini --set $cfg DEFAULT rabbit_host ${RABBITMQ_SERVICE_HOST}
-crudini --set $cfg DEFAULT rabbit_port 5672
-crudini --set $cfg DEFAULT rabbit_hosts ${RABBITMQ_SERVICE_HOST}:5672
-crudini --set $cfg DEFAULT rabbit_use_ssl False
-crudini --set $cfg DEFAULT rabbit_userid ${RABBIT_USERID}
-crudini --set $cfg DEFAULT rabbit_password "${RABBIT_PASSWORD}"
-crudini --set $cfg DEFAULT rabbit_virtual_host /
-crudini --set $cfg DEFAULT rabbit_ha_queues False
-crudini --set $cfg DEFAULT rpc_backend nova.openstack.common.rpc.impl_kombu
-crudini --set $cfg DEFAULT enabled_apis ${ENABLED_APIS}
-crudini --set $cfg DEFAULT ec2_listen 0.0.0.0
-crudini --set $cfg DEFAULT osapi_compute_listen 0.0.0.0
-crudini --set $cfg DEFAULT osapi_compute_workers 8
-crudini --set $cfg DEFAULT metadata_host ${METADATA_HOST}
-crudini --set $cfg DEFAULT metadata_listen 0.0.0.0
-crudini --set $cfg DEFAULT metadata_workers 8
-crudini --set $cfg DEFAULT service_down_time 60
-crudini --set $cfg DEFAULT rootwrap_config /etc/nova/rootwrap.conf
-crudini --set $cfg DEFAULT auth_strategy keystone
-crudini --set $cfg DEFAULT use_forwarded_for False
-crudini --set $cfg DEFAULT glance_api_servers ${GLANCE_API_SERVICE_HOST}:9292
-crudini --set $cfg DEFAULT cpu_allocation_ratio 16.0
-crudini --set $cfg DEFAULT ram_allocation_ratio 1.5
-crudini --set $cfg DEFAULT scheduler_default_filters RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,CoreFilter
-crudini --set $cfg DEFAULT compute_driver nova.virt.libvirt.LibvirtDriver
-crudini --set $cfg DEFAULT vif_plugging_is_fatal True
-crudini --set $cfg DEFAULT vif_plugging_timeout 300
-crudini --set $cfg DEFAULT volume_api_class nova.volume.cinder.API
-crudini --set $cfg DEFAULT image_service nova.image.glance.GlanceImageService
-crudini --set $cfg DEFAULT osapi_volume_listen 0.0.0.0
-crudini --set $cfg DEFAULT instances_path /var/lib/nova/instances
-crudini --set $cfg DEFAULT lock_path /var/lib/nova/lock
-
-# This is not created by openstack-nova packaging
-mkdir -p /var/lib/nova/lock
-
-# configure logging
-crudini --set $cfg DEFAULT log_dir "${NOVA_LOG_DIR}"
-crudini --set $cfg DEFAULT debug "${DEBUG_LOGGING}"
-crudini --set $cfg DEFAULT verbose "${VERBOSE_LOGGING}"
-
-crudini --set $cfg DEFAULT admin_token "${KEYSTONE_ADMIN_TOKEN}"
-
-crudini --set $cfg conductor workers 8
-
-if [ "${NETWORK_MANAGER}" == "nova" ] ; then
- crudini --set $cfg DEFAULT network_manager nova.network.manager.FlatDHCPManager
- crudini --set $cfg DEFAULT firewall_driver nova.virt.libvirt.firewall.IptablesFirewallDriver
- crudini --set $cfg DEFAULT network_size 254
- crudini --set $cfg DEFAULT allow_same_net_traffic False
- crudini --set $cfg DEFAULT multi_host True
- crudini --set $cfg DEFAULT send_arp_for_ha True
- crudini --set $cfg DEFAULT share_dhcp_address True
- crudini --set $cfg DEFAULT force_dhcp_release True
- crudini --set $cfg DEFAULT flat_interface $FLAT_INTERFACE
- crudini --set $cfg DEFAULT flat_network_bridge br100
- crudini --set $cfg DEFAULT public_interface $PUBLIC_INTERFACE
-elif [ "${NETWORK_MANAGER}" == "neutron" ] ; then
- check_required_vars NEUTRON_SHARED_SECRET
- crudini --set $cfg neutron service_metadata_proxy True
- crudini --set $cfg neutron metadata_proxy_shared_secret ${NEUTRON_SHARED_SECRET}
- crudini --set $cfg DEFAULT neutron_default_tenant_id default
- crudini --set $cfg DEFAULT network_api_class nova.network.neutronv2.api.API
- crudini --set $cfg DEFAULT security_group_api neutron
- if [[ "${MECHANISM_DRIVERS}" =~ linuxbridge ]] ; then
- crudini --set $cfg DEFAULT linuxnet_interface_driver nova.network.linux_net.NeutronLinuxBridgeInterfaceDriver
- elif [[ "${MECHANISM_DRIVERS}" =~ openvswitch ]] ; then
- crudini --set $cfg DEFAULT linuxnet_interface_driver nova.network.linux_net.LinuxOVSInterfaceDriver
- fi
- crudini --set $cfg DEFAULT libvirt_vif_driver nova.virt.libvirt.vif.LibvirtGenericVIFDriver
- crudini --set $cfg DEFAULT firewall_driver nova.virt.firewall.NoopFirewallDriver
- crudini --set $cfg neutron url http://${NEUTRON_SERVER_SERVICE_HOST}:${NEUTRON_SERVER_SERVICE_PORT}
- crudini --set $cfg neutron auth_strategy keystone
- crudini --set $cfg neutron admin_auth_url ${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v2.0
- crudini --set $cfg neutron admin_tenant_name ${ADMIN_TENANT_NAME}
- crudini --set $cfg neutron admin_username ${NEUTRON_KEYSTONE_USER}
- crudini --set $cfg neutron admin_password ${NEUTRON_KEYSTONE_PASSWORD}
-else
- echo "Incorrect NETWORK_MANAGER ${NETWORK_MANAGER}. Supported options are nova and neutron."
- exit 1
-fi
-
-# disabled pending answers to http://lists.openstack.org/pipermail/openstack/2014-October/009997.html
-#for option in auth_protocol auth_host auth_port; do
-# crudini --del $cfg \
-# keystone_authtoken \
-# $option
-#done
-
-crudini --set $cfg keystone_authtoken auth_uri "http://${KEYSTONE_PUBLIC_SERVICE_HOST}:5000/"
-crudini --set $cfg keystone_authtoken auth_protocol http
-crudini --set $cfg keystone_authtoken auth_host ${KEYSTONE_PUBLIC_SERVICE_HOST}
-crudini --set $cfg keystone_authtoken auth_port 5000
-
-crudini --set $cfg keystone_authtoken admin_user ${NOVA_KEYSTONE_USER}
-crudini --set $cfg keystone_authtoken admin_password "${NOVA_KEYSTONE_PASSWORD}"
-crudini --set $cfg keystone_authtoken admin_tenant_name ${ADMIN_TENANT_NAME}
-
-cat > /openrc <<EOF
-export OS_AUTH_URL="http://${KEYSTONE_PUBLIC_SERVICE_HOST}:5000/v2.0"
-export OS_USERNAME="${NOVA_KEYSTONE_USER}"
-export OS_PASSWORD="${NOVA_KEYSTONE_PASSWORD}"
-export OS_TENANT_NAME="${ADMIN_TENANT_NAME}"
-EOF
-
-# Configure database connection
-crudini --set $cfg \
- database \
- connection \
- "mysql://${NOVA_DB_USER}:${NOVA_DB_PASSWORD}@${MARIADB_SERVICE_HOST}/${NOVA_DB_NAME}"
+../../../common/nova-base/config-nova.sh \ No newline at end of file
diff --git a/docker/centos/binary/nova-compute/nova-compute/config-nova-compute.sh b/docker/centos/binary/nova-compute/nova-compute/config-nova-compute.sh
index 9a2c12572..0f3c1216c 100755..120000
--- a/docker/centos/binary/nova-compute/nova-compute/config-nova-compute.sh
+++ b/docker/centos/binary/nova-compute/nova-compute/config-nova-compute.sh
@@ -1,28 +1 @@
-#!/bin/bash
-
-. /opt/kolla/kolla-common.sh
-. /opt/kolla/config-nova.sh
-
-cfg=/etc/nova/nova.conf
-
-check_required_vars NOVA_VNCSERVER_PROXYCLIENT_ADDRESS NOVA_NOVNC_PROXY_PORT \
- NOVA_NOVNC_BASE_ADDRESS
-
-# Configures novnc to listen on all interfaces and instructs nova-compute to
-# announce PROXYCLIENT_IP to the nova-vncproxy. Clients like Horizon will
-# connect with this address.
-# As such, NOVA_VNCSERVER_PROXYCLIENT_ADDRESS is unique per compute node.
-crudini --set $cfg DEFAULT vnc_enabled "True"
-crudini --set $cfg DEFAULT vncserver_listen "0.0.0.0"
-crudini --set $cfg DEFAULT vncserver_proxyclient_address "${NOVA_VNCSERVER_PROXYCLIENT_ADDRESS}"
-crudini --set $cfg DEFAULT novncproxy_base_url "http://${NOVA_NOVNC_BASE_ADDRESS}:${NOVA_NOVNC_PROXY_PORT}/vnc_auto.html"
-
-# configure logging
-crudini --set $cfg DEFAULT log_file "${NOVA_COMPUTE_LOG_FILE}"
-
-# set qmeu emulation if no hardware acceleration found
-if [[ `egrep -c '(vmx|svm)' /proc/cpuinfo` == 0 ]]; then
- crudini --set $cfg libvirt virt_type qemu
-fi
-
-mkdir -p /var/lib/nova/instances
+../../../../common/nova-compute/nova-compute/config-nova-compute.sh \ No newline at end of file
diff --git a/docker/centos/binary/nova-compute/nova-compute/start.sh b/docker/centos/binary/nova-compute/nova-compute/start.sh
index ce3d0c0c3..ef5d32f18 100755..120000
--- a/docker/centos/binary/nova-compute/nova-compute/start.sh
+++ b/docker/centos/binary/nova-compute/nova-compute/start.sh
@@ -1,10 +1 @@
-#!/bin/bash
-
-set -e
-
-. /opt/kolla/config-nova-compute.sh
-
-sleep 6
-
-echo "Starting nova-compute."
-exec /usr/bin/nova-compute --config-file /etc/nova/nova.conf
+../../../../common/nova-compute/nova-compute/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/nova-compute/nova-libvirt/start.sh b/docker/centos/binary/nova-compute/nova-libvirt/start.sh
index bdbe882b8..eac909978 100755..120000
--- a/docker/centos/binary/nova-compute/nova-libvirt/start.sh
+++ b/docker/centos/binary/nova-compute/nova-libvirt/start.sh
@@ -1,22 +1 @@
-#!/bin/bash
-
-if [[ $(cat /proc/cpuinfo | grep vmx) ]]; then
- modprobe kvm_intel
-elif [[ $(cat /proc/cpuinfo | grep svm) ]]; then
- modprobe kvm_amd
-else
- echo "WARNING: Your hardware does not support hardware virtualization -" \
- "using qemu software virtualization instead"
-fi
-
-modprobe ip6_tables ip_tables ebtable_nat
-
-# If libvirt is not installed on the host permissions need to be set
-# If running in qemu, we don't need to set anything as /dev/kvm won't exist
-if [[ -c /dev/kvm ]]; then
- chmod 660 /dev/kvm
- chown root:kvm /dev/kvm
-fi
-
-echo "Starting libvirtd."
-exec /usr/sbin/libvirtd
+../../../../common/nova-compute/nova-libvirt/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/nova-compute/nova-network/config-nova-network.sh b/docker/centos/binary/nova-compute/nova-network/config-nova-network.sh
index 6976d3a20..ed1af588e 100755..120000
--- a/docker/centos/binary/nova-compute/nova-network/config-nova-network.sh
+++ b/docker/centos/binary/nova-compute/nova-network/config-nova-network.sh
@@ -1,30 +1 @@
-#!/bin/bash
-
-. /opt/kolla/config-nova.sh
-
-cfg=/etc/nova/nova.conf
-
-# configure logging
-crudini --set $cfg DEFAULT log_file "${NOVA_NETWORK_LOG_FILE}"
-
-# Configure eth1 as a physcial interface for nova flat network
-cat > /etc/sysconfig/network-scripts/ifcfg-$FLAT_INTERFACE <<EOF
-DEVICE="$FLAT_INTERFACE"
-BOOTPROTO="none"
-ONBOOT="yes"
-TYPE="Ethernet"
-EOF
-
-/usr/sbin/ifup $FLAT_INTERFACE
-
-cfg=/etc/nova/nova.conf
-
-crudini --set $cfg DEFAULT network_manager nova.network.manager.FlatDHCPManager
-crudini --set $cfg DEFAULT firewall_driver nova.virt.libvirt.firewall.IptablesFirewallDriver
-crudini --set $cfg DEFAULT network_size 254
-crudini --set $cfg DEFAULT allow_same_net_traffic False
-crudini --set $cfg DEFAULT multi_host True
-crudini --set $cfg DEFAULT send_arp_for_ha True
-crudini --set $cfg DEFAULT share_dhcp_address True
-crudini --set $cfg DEFAULT force_dhcp_release True
-crudini --set $cfg DEFAULT flat_network_bridge br100
+../../../../common/nova-compute/nova-network/config-nova-network.sh \ No newline at end of file
diff --git a/docker/centos/binary/nova-compute/nova-network/start.sh b/docker/centos/binary/nova-compute/nova-network/start.sh
index 92381b720..f2bec1979 100755..120000
--- a/docker/centos/binary/nova-compute/nova-network/start.sh
+++ b/docker/centos/binary/nova-compute/nova-network/start.sh
@@ -1,8 +1 @@
-#!/bin/bash
-
-set -e
-
-. /opt/kolla/config-nova-network.sh
-
-# Start nova-network
-exec /usr/bin/nova-network --config-file /etc/nova/nova.conf
+../../../../common/nova-compute/nova-network/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/nova-controller/nova-api/check.sh b/docker/centos/binary/nova-controller/nova-api/check.sh
index b250682d8..2a047038e 100755..120000
--- a/docker/centos/binary/nova-controller/nova-api/check.sh
+++ b/docker/centos/binary/nova-controller/nova-api/check.sh
@@ -1,17 +1 @@
-#!/bin/bash
-
-RES=0
-
-. /openrc
-if ! keystone token-get > /dev/null; then
- echo "ERROR: keystone token-get failed" >&2
- RES=1
-else
- if ! nova list > /dev/null; then
- echo "ERROR: nova list failed" >&2
- RES=1
- fi
-fi
-
-exit $RES
-
+../../../../common/nova-controller/nova-api/check.sh \ No newline at end of file
diff --git a/docker/centos/binary/nova-controller/nova-api/start.sh b/docker/centos/binary/nova-controller/nova-api/start.sh
index 7928370a4..7613d713a 100755..120000
--- a/docker/centos/binary/nova-controller/nova-api/start.sh
+++ b/docker/centos/binary/nova-controller/nova-api/start.sh
@@ -1,46 +1 @@
-#!/bin/bash
-
-set -e
-
-. /opt/kolla/config-nova.sh
-
-check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
- NOVA_KEYSTONE_USER NOVA_KEYSTONE_PASSWORD \
- ADMIN_TENANT_NAME NOVA_API_SERVICE_HOST \
- NOVA_EC2_API_SERVICE_HOST PUBLIC_IP NOVA_DB_NAME
-fail_unless_os_service_running keystone
-fail_unless_db $NOVA_DB_NAME
-
-export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
-export SERVICE_ENDPOINT="http://${KEYSTONE_ADMIN_SERVICE_HOST}:35357/v2.0"
-
-cfg=/etc/nova/nova.conf
-
-# configure logging
-crudini --set $cfg DEFAULT log_file "${NOVA_API_LOG_FILE}"
-
-crux user-create --update \
- -n "${NOVA_KEYSTONE_USER}" \
- -p "${NOVA_KEYSTONE_PASSWORD}" \
- -t "${ADMIN_TENANT_NAME}" \
- -r admin
-
-crux endpoint-create --remove-all \
- -n ec2 -t ec2 \
- -I "http://${NOVA_EC2_API_SERVICE_HOST}:8773/services/Cloud" \
- -P "http://${PUBLIC_IP}:8773/services/Cloud" \
- -A "http://${NOVA_EC2_API_SERVICE_HOST}:8773/services/Admin"
-
-crux endpoint-create --remove-all \
- -n nova -t compute \
- -I "http://${NOVA_API_SERVICE_HOST}:8774/v2/\$(tenant_id)s" \
- -P "http://${PUBLIC_IP}:8774/v2/\$(tenant_id)s" \
- -A "http://${NOVA_API_SERVICE_HOST}:8774/v2/\$(tenant_id)s"
-
-crux endpoint-create --remove-all \
- -n novav3 -t computev3 \
- -I "http://${NOVA_API_SERVICE_HOST}:8774/v3" \
- -P "http://${PUBLIC_IP}:8774/v3" \
- -A "http://${NOVA_API_SERVICE_HOST}:8774/v3"
-
-exec /usr/bin/nova-api --config-file /etc/nova/nova.conf
+../../../../common/nova-controller/nova-api/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/nova-controller/nova-conductor/start.sh b/docker/centos/binary/nova-controller/nova-conductor/start.sh
index 575e7ff6c..2b0dc28f8 100755..120000
--- a/docker/centos/binary/nova-controller/nova-conductor/start.sh
+++ b/docker/centos/binary/nova-controller/nova-conductor/start.sh
@@ -1,23 +1 @@
-#!/bin/bash
-
-set -e
-
-. /opt/kolla/config-nova.sh
-
-check_required_vars NOVA_DB_NAME NOVA_DB_USER NOVA_DB_PASSWORD
-fail_unless_db
-
-cfg=/etc/nova/nova.conf
-
-# configure logging
-crudini --set $cfg DEFAULT log_file "${NOVA_CONDUCTOR_LOG_FILE}"
-
-mysql -h ${MARIADB_SERVICE_HOST} -u root -p${DB_ROOT_PASSWORD} mysql <<EOF
-CREATE DATABASE IF NOT EXISTS ${NOVA_DB_NAME};
-GRANT ALL PRIVILEGES ON ${NOVA_DB_NAME}.* TO
- '${NOVA_DB_USER}'@'%' IDENTIFIED BY '${NOVA_DB_PASSWORD}'
-EOF
-
-nova-manage db sync
-
-exec /usr/bin/nova-conductor --config-file /etc/nova/nova.conf
+../../../../common/nova-controller/nova-conductor/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/nova-controller/nova-consoleauth/start.sh b/docker/centos/binary/nova-controller/nova-consoleauth/start.sh
index a1b0864ac..0821b3c38 100755..120000
--- a/docker/centos/binary/nova-controller/nova-consoleauth/start.sh
+++ b/docker/centos/binary/nova-controller/nova-consoleauth/start.sh
@@ -1,11 +1 @@
-#!/bin/bash
-set -e
-
-. /opt/kolla/config-nova.sh
-
-cfg=/etc/nova/nova.conf
-
-crudini --set $cfg DEFAULT log_file "${NOVA_CONSOLEAUTH_LOG_FILE}"
-
-echo Starting nova-consoleauth
-exec /usr/bin/nova-consoleauth
+../../../../common/nova-controller/nova-consoleauth/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/nova-controller/nova-novncproxy/start.sh b/docker/centos/binary/nova-controller/nova-novncproxy/start.sh
index 9edafbca3..80b6459a4 100755..120000
--- a/docker/centos/binary/nova-controller/nova-novncproxy/start.sh
+++ b/docker/centos/binary/nova-controller/nova-novncproxy/start.sh
@@ -1,22 +1 @@
-#!/bin/bash
-set -e
-. /opt/kolla/kolla-common.sh
-
-cfg=/etc/nova/nova.conf
-
-check_required_vars PUBLIC_IP NOVA_NOVNC_PROXY_SERVICE_HOST NOVA_NOVNC_PROXY_PORT \
- NOVA_NOVNC_BASE_ADDRESS NOVA_VNCSERVER_LISTEN_ADDRESS \
- NOVA_VNCSERVER_PROXYCLIENT_ADDRESS
-
-crudini --set $cfg DEFAULT log_file "${NOVA_NOVNCPROXY_LOG_FILE}"
-
-# Listen on all interfaces on port $NOVA_NOVNC_PROXY_PORT for incoming novnc
-# requests.
-# The base_url is given to clients to connect to, like Horizon, so this could
-# very well be fancy DNS name.
-echo Configuring VNC...
-crudini --set $cfg DEFAULT vncserver_listen "${NOVA_VNCSERVER_LISTEN_ADDRESS}"
-crudini --set $cfg DEFAULT vncserver_proxyclient_address "${NOVA_VNCSERVER_PROXYCLIENT_ADDRESS}"
-
-echo Starting nova-novncproxy
-exec /usr/bin/nova-novncproxy
+../../../../common/nova-controller/nova-novncproxy/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/nova-controller/nova-scheduler/start.sh b/docker/centos/binary/nova-controller/nova-scheduler/start.sh
index 504c049ed..a72115139 100755..120000
--- a/docker/centos/binary/nova-controller/nova-scheduler/start.sh
+++ b/docker/centos/binary/nova-controller/nova-scheduler/start.sh
@@ -1,15 +1 @@
-#!/bin/bash
-
-set -e
-
-. /opt/kolla/config-nova.sh
-
-check_required_vars NOVA_DB_NAME
-fail_unless_db $NOVA_DB_NAME
-
-cfg=/etc/nova/nova.conf
-
-# configure logging
-crudini --set $cfg DEFAULT log_file "${NOVA_SCHEDULER_LOG_FILE}"
-
-exec /usr/bin/nova-scheduler --config-file /etc/nova/nova.conf
+../../../../common/nova-controller/nova-scheduler/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/rabbitmq/rabbitmq-env.conf b/docker/centos/binary/rabbitmq/rabbitmq-env.conf
index e76f18f0b..af9f8525e 100644..120000
--- a/docker/centos/binary/rabbitmq/rabbitmq-env.conf
+++ b/docker/centos/binary/rabbitmq/rabbitmq-env.conf
@@ -1,2 +1 @@
-RABBITMQ_NODENAME=@RABBITMQ_NODENAME@
-RABBITMQ_LOG_BASE=@RABBITMQ_LOG_BASE@
+../../../common/rabbitmq/rabbitmq-env.conf \ No newline at end of file
diff --git a/docker/centos/binary/rabbitmq/rabbitmq.config b/docker/centos/binary/rabbitmq/rabbitmq.config
index 15a47eba1..cfb088507 100644..120000
--- a/docker/centos/binary/rabbitmq/rabbitmq.config
+++ b/docker/centos/binary/rabbitmq/rabbitmq.config
@@ -1,11 +1 @@
-[
- {rabbit, [
- {default_user, <<"@RABBITMQ_USER@">>},
- {default_pass, <<"@RABBITMQ_PASS@">>}
- ]},
- {kernel, [
-
- ]}
-].
-% EOF
-
+../../../common/rabbitmq/rabbitmq.config \ No newline at end of file
diff --git a/docker/centos/binary/rabbitmq/start.sh b/docker/centos/binary/rabbitmq/start.sh
index f70c34866..035f55e26 100755..120000
--- a/docker/centos/binary/rabbitmq/start.sh
+++ b/docker/centos/binary/rabbitmq/start.sh
@@ -1,24 +1 @@
-#!/bin/bash
-
-set -e
-
-: ${RABBITMQ_USER:=guest}
-: ${RABBITMQ_PASS:=guest}
-: ${RABBITMQ_NODENAME:=rabbit}
-: ${RABBITMQ_LOG_BASE:=/var/log/rabbitmq}
-
-sed -i '
- s|@RABBITMQ_USER@|'"$RABBITMQ_USER"'|g
- s|@RABBITMQ_PASS@|'"$RABBITMQ_PASS"'|g
-' /etc/rabbitmq/rabbitmq.config
-
-sed -i '
- s|@RABBITMQ_NODENAME@|'"$RABBITMQ_NODENAME"'|g
- s|@RABBITMQ_LOG_BASE@|'"$RABBITMQ_LOG_BASE"'|g
-' /etc/rabbitmq/rabbitmq-env.conf
-
-# work around:
-# https://bugs.launchpad.net/ubuntu/+source/rabbitmq-server/+bug/653405
-echo "${RABBITMQ_SERVICE_HOST} `/usr/bin/hostname -s`" > /etc/hosts
-
-exec /usr/sbin/rabbitmq-server
+../../../common/rabbitmq/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/swift/swift-account/start.sh b/docker/centos/binary/swift/swift-account/start.sh
index bf86830f9..f9e76aa5b 100644..120000
--- a/docker/centos/binary/swift/swift-account/start.sh
+++ b/docker/centos/binary/swift/swift-account/start.sh
@@ -1,34 +1 @@
-#!/bin/bash
-
-: ${SWIFT_DB_USER:=swift}
-: ${SWIFT_DB_NAME:=swift}
-: ${KEYSTONE_AUTH_PROTOCOL:=http}
-: ${SWIFT_KEYSTONE_USER:=swift}
-: ${ADMIN_TENANT_NAME:=admin}
-
-check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
- SWIFT_ADMIN_PASSWORD
-fail_unless_db
-fail_unless_os_service_running keystone
-
-if ! [ "$SWIFT_DB_PASSWORD" ]; then
- SWIFT_DB_PASSWORD=$(openssl rand -hex 15)
- export SWIFT_DB_PASSWORD
-fi
-
-sh /opt/swift/config-swift.sh account-server
-
-mysql -h ${MARIADB_SERVICE_HOST} -u root -p${DB_ROOT_PASSWORD} mysql <<EOF
-CREATE DATABASE IF NOT EXISTS ${SWIFT_DB_NAME};
-GRANT ALL PRIVILEGES ON swift* TO
-'${SWIFT_DB_USER}'@'%' IDENTIFIED BY '${SWIFT_DB_PASSWORD}'
-EOF
-
-export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
-export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:35357/v2.0"
-
-/bin/keystone user-create --name ${SWIFT_KEYSTONE_USER} --pass ${SWIFT_ADMIN_PASSWORD}
-/bin/keystone role-create --name ${SWIFT_KEYSTONE_USER}
-/bin/keystone user-role-add --user ${SWIFT_KEYSTONE_USER} --role admin --tenant ${ADMIN_TENANT_NAME}
-
-exec /usr/bin/swift-engine
+../../../../common/swift/swift-account/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/swift/swift-container/start.sh b/docker/centos/binary/swift/swift-container/start.sh
index 42d4ccf35..dc3c88490 100644..120000
--- a/docker/centos/binary/swift/swift-container/start.sh
+++ b/docker/centos/binary/swift/swift-container/start.sh
@@ -1,34 +1 @@
-#!/bin/bash
-
-: ${SWIFT_DB_USER:=swift}
-: ${SWIFT_DB_NAME:=swift}
-: ${KEYSTONE_AUTH_PROTOCOL:=http}
-: ${SWIFT_KEYSTONE_USER:=swift}
-: ${ADMIN_TENANT_NAME:=admin}
-
-check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
- SWIFT_ADMIN_PASSWORD
-fail_unless_db
-fail_unless_os_service_running keystone
-
-if ! [ "$SWIFT_DB_PASSWORD" ]; then
- SWIFT_DB_PASSWORD=$(openssl rand -hex 15)
- export SWIFT_DB_PASSWORD
-fi
-
-sh /opt/swift/config-swift.sh container
-
-mysql -h ${MARIADB_SERVICE_HOST} -u root -p${DB_ROOT_PASSWORD} mysql <<EOF
-CREATE DATABASE IF NOT EXISTS ${SWIFT_DB_NAME};
-GRANT ALL PRIVILEGES ON swift* TO
-'${SWIFT_DB_USER}'@'%' IDENTIFIED BY '${SWIFT_DB_PASSWORD}'
-EOF
-
-export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
-export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:35357/v2.0"
-
-/bin/keystone user-create --name ${SWIFT_KEYSTONE_USER} --pass ${SWIFT_ADMIN_PASSWORD}
-/bin/keystone role-create --name ${SWIFT_KEYSTONE_USER}
-/bin/keystone user-role-add --user ${SWIFT_KEYSTONE_USER} --role admin --tenant ${ADMIN_TENANT_NAME}
-
-exec /usr/bin/swift-container-server
+../../../../common/swift/swift-container/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/swift/swift-object/start.sh b/docker/centos/binary/swift/swift-object/start.sh
index 7ed97536e..690be2540 100644..120000
--- a/docker/centos/binary/swift/swift-object/start.sh
+++ b/docker/centos/binary/swift/swift-object/start.sh
@@ -1,34 +1 @@
-#!/bin/bash
-
-: ${SWIFT_DB_USER:=swift}
-: ${SWIFT_DB_NAME:=swift}
-: ${KEYSTONE_AUTH_PROTOCOL:=http}
-: ${SWIFT_KEYSTONE_USER:=swift}
-: ${ADMIN_TENANT_NAME:=admin}
-
-check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
- SWIFT_ADMIN_PASSWORD
-fail_unless_db
-fail_unless_os_service_running keystone
-
-if ! [ "$SWIFT_DB_PASSWORD" ]; then
- SWIFT_DB_PASSWORD=$(openssl rand -hex 15)
- export SWIFT_DB_PASSWORD
-fi
-
-sh /opt/swift/config-swift.sh engine
-
-mysql -h ${MARIADB_SERVICE_HOST} -u root -p${DB_ROOT_PASSWORD} mysql <<EOF
-CREATE DATABASE IF NOT EXISTS ${SWIFT_DB_NAME};
-GRANT ALL PRIVILEGES ON swift* TO
-'${SWIFT_DB_USER}'@'%' IDENTIFIED BY '${SWIFT_DB_PASSWORD}'
-EOF
-
-export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
-export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:35357/v2.0"
-
-/bin/keystone user-create --name ${SWIFT_KEYSTONE_USER} --pass ${SWIFT_ADMIN_PASSWORD}
-/bin/keystone role-create --name ${SWIFT_KEYSTONE_USER}
-/bin/keystone user-role-add --user ${SWIFT_KEYSTONE_USER} --role admin --tenant ${ADMIN_TENANT_NAME}
-
-exec /usr/bin/swift-object-server
+../../../../common/swift/swift-object/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/swift/swift-proxy-server/start.sh b/docker/centos/binary/swift/swift-proxy-server/start.sh
index 3f387d187..6a5581a46 100644..120000
--- a/docker/centos/binary/swift/swift-proxy-server/start.sh
+++ b/docker/centos/binary/swift/swift-proxy-server/start.sh
@@ -1,5 +1 @@
-#!/bin/bash
-
-sh /opt/swift/config-swift.sh proxy
-
-exec /usr/bin/swift-proxy-server
+../../../../common/swift/swift-proxy-server/start.sh \ No newline at end of file
diff --git a/docker/centos/binary/zaqar/check.sh b/docker/centos/binary/zaqar/check.sh
index 4b3cdbb46..48c775659 100755..120000
--- a/docker/centos/binary/zaqar/check.sh
+++ b/docker/centos/binary/zaqar/check.sh
@@ -1,10 +1 @@
-#!/bin/bash
-
-status=$(curl -s -w "%{http_code}" -o /dev/null http://localhost:8888/v1/queues)
-
-if [[ $status -ne 200 && $status -ne 204 ]]; then
- echo "ERROR($status): queue list failed"
- exit $status
-fi
-
-exit 0
+../../../common/zaqar/check.sh \ No newline at end of file
diff --git a/docker/centos/binary/zaqar/start.sh b/docker/centos/binary/zaqar/start.sh
index 6c68fccf2..48134a044 100755..120000
--- a/docker/centos/binary/zaqar/start.sh
+++ b/docker/centos/binary/zaqar/start.sh
@@ -1,64 +1 @@
-#!/bin/sh
-
-set -e
-
-. /opt/kolla/kolla-common.sh
-
-: ${ADMIN_TENANT_NAME:=admin}
-: ${ZAQAR_KEYSTONE_USER:=zaqar}
-: ${KEYSTONE_AUTH_PROTOCOL:=http}
-
-check_required_vars ZAQAR_KEYSTONE_PASSWORD ZAQAR_SERVER_SERVICE_HOST \
- KEYSTONE_ADMIN_SERVICE_HOST KEYSTONE_ADMIN_TOKEN \
- PUBLIC_IP
-dump_vars
-
-#check_for_mongodb
-check_for_keystone
-
-cat > /openrc <<EOF
-export OS_AUTH_URL="http://${KEYSTONE_PUBLIC_SERVICE_HOST}:5000/v2.0"
-export OS_USERNAME="${ZAQAR_KEYSTONE_USER}"
-export OS_PASSWORD="${ZAQAR_KEYSTONE_PASSWORD}"
-export OS_TENANT_NAME="${ADMIN_TENANT_NAME}"
-EOF
-
-cfg=/etc/zaqar/zaqar.conf
-
-crudini --set $cfg DEFAULT log_file \
- ""
-crudini --set $cfg DEFAULT use_stderr \
- true
-
-crudini --set $cfg drivers storage \
- sqlite
-
-crudini --set $cfg keystone_authtoken admin_password \
- "${ZAQAR_KEYSTONE_PASSWORD}"
-crudini --set $cfg keystone_authtoken admin_user \
- "${ZAQAR_KEYSTONE_USER}"
-crudini --set $cfg keystone_authtoken admin_tenant_name \
- "${ADMIN_TENANT_NAME}"
-crudini --set $cfg keystone_authtoken auth_uri \
- "${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_PUBLIC_SERVICE_HOST}:5000/v2.0"
-crudini --set $cfg keystone_authtoken auth_protocol \
- "${KEYSTONE_AUTH_PROTOCOL}"
-crudini --set $cfg keystone_authtoken auth_host \
- "${KEYSTONE_PUBLIC_SERVICE_HOST}"
-crudini --set $cfg keystone_authtoken auth_port \
- 5000
-
-
-export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
-export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:35357/v2.0"
-crux user-create -n ${ZAQAR_KEYSTONE_USER} \
- -p ${ZAQAR_KEYSTONE_PASSWORD} \
- -t ${ADMIN_TENANT_NAME} \
- -r admin
-
-crux endpoint-create --remove-all -n ${ZAQAR_KEYSTONE_USER} -t messaging \
- -I "${KEYSTONE_AUTH_PROTOCOL}://${ZAQAR_SERVER_SERVICE_HOST}:8888" \
- -P "${KEYSTONE_AUTH_PROTOCOL}://${PUBLIC_IP}:8888" \
- -A "${KEYSTONE_AUTH_PROTOCOL}://${ZAQAR_SERVER_SERVICE_HOST}:8888"
-
-exec /usr/bin/zaqar-server
+../../../common/zaqar/start.sh \ No newline at end of file
diff --git a/docker/common/barbican/start.sh b/docker/common/barbican/start.sh
new file mode 100755
index 000000000..673aa4339
--- /dev/null
+++ b/docker/common/barbican/start.sh
@@ -0,0 +1,81 @@
+#!/bin/bash
+
+set -e
+
+: ${BARBICAN_DB_USER:=barbican}
+: ${BARBICAN_DB_NAME:=barbican}
+: ${KEYSTONE_AUTH_PROTOCOL:=http}
+: ${BARBICAN_KEYSTONE_USER:=barbican}
+: ${ADMIN_TENANT_NAME:=admin}
+
+if ! [ "$BARBICAN_DB_PASSWORD" ]; then
+ BARBICAN_DB_PASSWORD=$(openssl rand -hex 15)
+ export BARBICAN_DB_PASSWORD
+fi
+
+check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
+ KEYSTONE_ADMIN_SERVICE_PORT BARBICAN_ADMIN_PASSWORD
+fail_unless_db
+fail_unless_os_service_running keystone
+
+mysql -h ${MARIADB_SERVICE_HOST} -u root -p"${DB_ROOT_PASSWORD}" mysql <<EOF
+CREATE DATABASE IF NOT EXISTS ${BARBICAN_DB_NAME};
+GRANT ALL PRIVILEGES ON barbican.* TO
+ '${BARBICAN_DB_USER}'@'%' IDENTIFIED BY '${BARBICAN_DB_PASSWORD}'
+EOF
+
+# config file setup
+crudini --set /etc/barbican/barbican-api.conf \
+ DEFAULT \
+ sql_connection \
+ "mysql://${BARBICAN_DB_USER}:${BARBICAN_DB_PASSWORD}@${MARIADB_SERVICE_HOST}/${BARBICAN_DB_NAME}"
+crudini --set /etc/barbican/barbican-api.conf \
+ DEFAULT \
+ log_dir \
+ "/var/log/barbican/"
+crudini --set /etc/barbican/barbican-api.conf \
+ DEFAULT \
+ log_file \
+ "/var/log/barbican/barbican.log"
+crudini --set /etc/barbican/barbican-api-paste.ini \
+ pipeline:barbican_api \
+ pipeline \
+ "keystone_authtoken context apiapp"
+crudini --set /etc/barbican/barbican-api-paste.ini \
+ filter:keystone_authtoken \
+ auth_host \
+ ${KEYSTONE_ADMIN_SERVICE_HOST}
+crudini --set /etc/barbican/barbican-api-paste.ini \
+ filter:keystone_authtoken \
+ auth_port \
+ ${KEYSTONE_ADMIN_SERVICE_PORT}
+crudini --set /etc/barbican/barbican-api-paste.ini \
+ filter:keystone_authtoken \
+ auth_protocol \
+ ${KEYSTONE_AUTH_PROTOCOL}
+crudini --set /etc/barbican/barbican-api-paste.ini \
+ filter:keystone_authtoken \
+ admin_tenant_name \
+ ${ADMIN_TENANT_NAME}
+crudini --set /etc/barbican/barbican-api-paste.ini \
+ filter:keystone_authtoken \
+ admin_user \
+ ${BARBICAN_KEYSTONE_USER}
+crudini --set /etc/barbican/barbican-api-paste.ini \
+ filter:keystone_authtoken \
+ admin_password \
+ ${BARBICAN_KEYSTONE_USER}
+
+# create the required keystone entities for barbican
+export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
+export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v2.0"
+
+keystone user-get ${BARBICAN_KEYSTONE_USER} > /dev/null 2>&1 || /bin/keystone user-create --name ${BARBICAN_KEYSTONE_USER} --pass ${BARBICAN_ADMIN_PASSWORD}
+
+keystone role-get observer > /dev/null 2>&1 || /bin/keystone role-create --name observer
+keystone role-get creator > /dev/null 2>&1 || /bin/keystone role-create --name creator
+
+keystone user-get ${BARBICAN_KEYSTONE_USER} > /dev/null 2>&1 || /bin/keystone user-role-add --user ${BARBICAN_KEYSTONE_USER} --role admin --tenant ${ADMIN_TENANT_NAME}
+
+# launch Barbican using uwsgi
+exec uwsgi --master --emperor /etc/barbican/vassals
diff --git a/docker/common/kolla-common.sh b/docker/common/base/kolla-common.sh
index 8c2ef5ec1..8c2ef5ec1 100644
--- a/docker/common/kolla-common.sh
+++ b/docker/common/base/kolla-common.sh
diff --git a/docker/common/service_hosts.sh b/docker/common/base/service_hosts.sh
index c3006f720..c3006f720 100755
--- a/docker/common/service_hosts.sh
+++ b/docker/common/base/service_hosts.sh
diff --git a/docker/common/ceilometer/ceilometer-alarm/start.sh b/docker/common/ceilometer/ceilometer-alarm/start.sh
new file mode 100644
index 000000000..7470ae608
--- /dev/null
+++ b/docker/common/ceilometer/ceilometer-alarm/start.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/kolla-common.sh
+. /opt/kolla/config-ceilometer.sh
+
+
+exec /usr/bin/ceilometer-alarm-evaluator &
+exec /usr/bin/ceilometer-alarm-notifier
diff --git a/docker/common/ceilometer/ceilometer-api/start.sh b/docker/common/ceilometer/ceilometer-api/start.sh
new file mode 100644
index 000000000..f081c9f84
--- /dev/null
+++ b/docker/common/ceilometer/ceilometer-api/start.sh
@@ -0,0 +1,51 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/kolla-common.sh
+. /opt/kolla/config-ceilometer.sh
+
+check_required_vars CEILOMETER_DB_USER CEILOMETER_DB_NAME \
+ CEILOMETER_DB_PASSWORD KEYSTONE_ADMIN_TOKEN \
+ KEYSTONE_AUTH_PROTOCOL KEYSTONE_ADMIN_SERVICE_HOST \
+ KEYSTONE_ADMIN_SERVICE_PORT ADMIN_TENANT_NAME \
+ CEILOMETER_KEYSTONE_USER CEILOMETER_ADMIN_PASSWORD \
+ CEILOMETER_API_SERVICE_HOST PUBLIC_IP
+
+fail_unless_os_service_running keystone
+fail_unless_db
+
+#TODO(pkilambi): Add mongodb support
+
+mysql -h ${MARIADB_SERVICE_HOST} -u root -p${DB_ROOT_PASSWORD} mysql <<EOF
+CREATE DATABASE IF NOT EXISTS ${CEILOMETER_DB_NAME} DEFAULT CHARACTER SET utf8;
+GRANT ALL PRIVILEGES ON ${CEILOMETER_DB_NAME}.* TO
+ '${CEILOMETER_DB_USER}'@'%' IDENTIFIED BY '${CEILOMETER_DB_PASSWORD}'
+
+EOF
+
+
+export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
+export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v2.0"
+
+
+crux user-create -n ${CEILOMETER_KEYSTONE_USER} \
+ -p ${CEILOMETER_ADMIN_PASSWORD} \
+ -t ${ADMIN_TENANT_NAME} \
+ -r admin
+
+crux service-create -n ${CEILOMETER_KEYSTONE_USER} -t metering \
+ -d "Ceilometer Telemetry Service"
+
+crux endpoint-create i--remove-all -n ${CEILOMETER_KEYSTONE_USER} -t metering \
+ -I "${KEYSTONE_AUTH_PROTOCOL}://${CEILOMETER_API_SERVICE_HOST}:8777" \
+ -P "${KEYSTONE_AUTH_PROTOCOL}://${PUBLIC_IP}:8777" \
+ -A "${KEYSTONE_AUTH_PROTOCOL}://${CEILOMETER_API_SERVICE_HOST}:8777"
+
+cfg=/etc/ceilometer/ceilometer.conf
+crudini --set $cfg \
+ DEFAULT connection
+ "mysql://${CEILOMETER_DB_USER}:${CEILOMETER_DB_PASSWORD}@${MARIADB_SERVICE_HOST}/${CEILOMETER_DB_NAME}"
+
+
+exec /usr/bin/ceilometer-api
diff --git a/docker/common/ceilometer/ceilometer-base/config-ceilometer.sh b/docker/common/ceilometer/ceilometer-base/config-ceilometer.sh
new file mode 100644
index 000000000..a2316dcd1
--- /dev/null
+++ b/docker/common/ceilometer/ceilometer-base/config-ceilometer.sh
@@ -0,0 +1,71 @@
+#!/bin/bash
+
+set -e
+. /opt/kolla/kolla-common.sh
+
+: ${CEILOMETER_DB_USER:=ceilometer}
+: ${CEILOMETER_DB_NAME:=ceilometer}
+: ${KEYSTONE_AUTH_PROTOCOL:=http}
+: ${CEILOMETER_KEYSTONE_USER:=admin}
+: ${CEILOMETER_ADMIN_PASSWORD:=kolla}
+: ${ADMIN_TENANT_NAME:=admin}
+: ${METERING_SECRET:=ceilometer}
+: ${RABBIT_PASSWORD:=guest}
+
+check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
+ KEYSTONE_ADMIN_SERVICE_PORT KEYSTONE_PUBLIC_SERVICE_HOST \
+dump_vars
+
+cat > /openrc <<EOF
+export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
+export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v2.0"
+EOF
+
+
+cfg=/etc/ceilometer/ceilometer.conf
+
+crudini --set $cfg \
+ DEFAULT rpc_backend rabbit
+crudini --set $cfg \
+ DEFAULT rabbit_host ${RABBITMQ_SERVICE_HOST}
+crudini --set $cfg \
+ DEFAULT rabbit_password ${RABBIT_PASSWORD}
+
+crudini --set $cfg \
+ keystone_authtoken \
+ auth_uri \
+ "http://${KEYSTONE_PUBLIC_SERVICE_HOST}:5000/"
+crudini --set $cfg \
+ keystone_authtoken \
+ admin_tenant_name \
+ "${ADMIN_TENANT_NAME}"
+crudini --set $cfg \
+ keystone_authtoken \
+ admin_user \
+ "${CEILOMETER_KEYSTONE_USER}"
+crudini --set $cfg \
+ keystone_authtoken \
+ admin_password \
+ ${CEILOMETER_ADMIN_PASSWORD}
+
+crudini --set $cfg \
+ service_credentials \
+ os_auth_url \
+ ${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_PUBLIC_SERVICE_HOST}:5000/
+crudini --set $cfg \
+ service_credentials \
+ os_username \
+ ceilometer
+crudini --set $cfg \
+ service_credentials \
+ os_tenant_name \
+ service
+crudini --set $cfg \
+ service_credentials \
+ os_password \
+ ${CEILOMETER_ADMIN_PASSWORD}
+
+crudini --set $cfg \
+ publisher
+ metering_secret
+ ${METERING_SECRET}
diff --git a/docker/common/ceilometer/ceilometer-central/start.sh b/docker/common/ceilometer/ceilometer-central/start.sh
new file mode 100644
index 000000000..76f9a1fc2
--- /dev/null
+++ b/docker/common/ceilometer/ceilometer-central/start.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+. /opt/kolla/kolla-common.sh
+. /opt/kolla/config-ceilometer.sh
+
+check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_AUTH_PROTOCOL \
+ KEYSTONE_ADMIN_SERVICE_HOST KEYSTONE_ADMIN_SERVICE_PORT
+
+fail_unless_os_service_running keystone
+
+export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
+export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v2.0"
+
+exec /usr/bin/ceilometer-agent-central
diff --git a/docker/common/ceilometer/ceilometer-collector/start.sh b/docker/common/ceilometer/ceilometer-collector/start.sh
new file mode 100644
index 000000000..1ed4c9e7d
--- /dev/null
+++ b/docker/common/ceilometer/ceilometer-collector/start.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/kolla-common.sh
+. /opt/kolla/config-ceilometer.sh
+
+
+exec /usr/bin/ceilometer-collector
diff --git a/docker/common/ceilometer/ceilometer-compute/start.sh b/docker/common/ceilometer/ceilometer-compute/start.sh
new file mode 100644
index 000000000..f4fc30bae
--- /dev/null
+++ b/docker/common/ceilometer/ceilometer-compute/start.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+. /opt/kolla/kolla-common.sh
+. /opt/kolla/config-ceilometer.sh
+
+
+check_required_vars KEYSTONE_ADMIN_TOKEN RABBITMQ_SERVICE_HOST RABBIT_PASSWORD
+
+fail_unless_os_service_running keystone
+
+# Nova conf settings
+crudini --set /etc/nova/nova.conf DEFAULT instance_usage_audit True
+crudini --set /etc/nova/nova.conf DEFAULT instance_usage_audit_period hour
+crudini --set /etc/nova/nova.conf DEFAULT notify_on_state_change vm_and_task_state
+crudini --set /etc/nova/nova.conf DEFAULT notification_driver nova.openstack.common.notifier.rpc_notifier
+crudini --set /etc/nova/nova.conf DEFAULT notification_driver ceilometer.compute.nova_notifier
+
+#ceilometer settings
+cfg=/etc/ceilometer/ceilometer.conf
+crudini --set $cfg publisher_rpc metering_secret ${KEYSTONE_ADMIN_TOKEN}
+crudini --set $cfg rabbit_host ${RABBITMQ_SERVICE_HOST}
+crudini --set $cfg rabbit_password ${RABBIT_PASSWORD}
+
+
+exec /usr/bin/ceilometer-agent-compute
diff --git a/docker/common/ceilometer/ceilometer-notification/start.sh b/docker/common/ceilometer/ceilometer-notification/start.sh
new file mode 100644
index 000000000..939734549
--- /dev/null
+++ b/docker/common/ceilometer/ceilometer-notification/start.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/kolla-common.sh
+. /opt/kolla/config-ceilometer.sh
+
+
+exec /usr/bin/ceilometer-agent-notification
diff --git a/docker/common/cinder-app/cinder-api/check.sh b/docker/common/cinder-app/cinder-api/check.sh
new file mode 100755
index 000000000..57b88f566
--- /dev/null
+++ b/docker/common/cinder-app/cinder-api/check.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+RES=0
+
+. /openrc
+if ! keystone token-get > /dev/null; then
+ echo "ERROR: keystone token-get failed" >&2
+ RES=1
+else
+ if ! cinder list > /dev/null; then
+ echo "ERROR: cinder list failed" >&2
+ RES=1
+ fi
+fi
+
+exit $RES
diff --git a/docker/common/cinder-app/cinder-api/start.sh b/docker/common/cinder-app/cinder-api/start.sh
new file mode 100755
index 000000000..28293ac6c
--- /dev/null
+++ b/docker/common/cinder-app/cinder-api/start.sh
@@ -0,0 +1,73 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/kolla-common.sh
+. /opt/kolla/config-cinder.sh
+
+check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
+ ADMIN_TENANT_NAME PUBLIC_IP CINDER_API_SERVICE_HOST \
+ KEYSTONE_AUTH_PROTOCOL KEYSTONE_ADMIN_SERVICE_PORT \
+ CINDER_KEYSTONE_USER CINDER_KEYSTONE_PASSWORD \
+ CINDER_API_LOG_FILE CINDER_API_SERVICE_LISTEN \
+ CINDER_API_SERVICE_PORT CINDER_API_SERVICE_LISTEN
+
+fail_unless_os_service_running keystone
+
+cfg=/etc/cinder/cinder.conf
+
+# Set the auth credentials
+export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
+export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v2.0"
+
+# Create Keystone User
+crux user-create --update \
+ -n "${CINDER_KEYSTONE_USER}" \
+ -p "${CINDER_KEYSTONE_PASSWORD}" \
+ -t "${ADMIN_TENANT_NAME}" \
+ -r admin
+
+# Configure Keystone
+crux endpoint-create --remove-all \
+ -n cinder \
+ -t volume \
+ -P "http://${CINDER_API_SERVICE_HOST}:${CINDER_API_SERVICE_PORT}/v1/\$(tenant_id)s" \
+ -A "http://${CINDER_API_SERVICE_HOST}:${CINDER_API_SERVICE_PORT}/v1/\$(tenant_id)s" \
+ -I "http://${CINDER_API_SERVICE_HOST}:${CINDER_API_SERVICE_PORT}/v1/\$(tenant_id)s"
+
+crux endpoint-create --remove-all \
+ -n cinderv2 \
+ -t volumev2 \
+ -P "http://${CINDER_API_SERVICE_HOST}:${CINDER_API_SERVICE_PORT}/v2/\$(tenant_id)s" \
+ -A "http://${CINDER_API_SERVICE_HOST}:${CINDER_API_SERVICE_PORT}/v2/\$(tenant_id)s" \
+ -I "http://${CINDER_API_SERVICE_HOST}:${CINDER_API_SERVICE_PORT}/v2/\$(tenant_id)s"
+
+# Logging
+crudini --set $cfg \
+ DEFAULT \
+ log_file \
+ "${CINDER_API_LOG_FILE}"
+
+# API Configuration
+crudini --set $cfg \
+ DEFAULT \
+ osapi_volume_listen \
+ "${CINDER_API_SERVICE_LISTEN}"
+
+crudini --set $cfg \
+ DEFAULT \
+ osapi_volume_listen_port \
+ "${CINDER_API_SERVICE_PORT}"
+
+crudini --set $cfg \
+ DEFAULT \
+ enable_v1_api \
+ "true"
+
+crudini --set $cfg \
+ DEFAULT \
+ enable_v2_api \
+ "true"
+
+echo "Starting cinder-api"
+exec /usr/bin/cinder-api --config-file $cfg
diff --git a/docker/common/cinder-app/cinder-backup/start.sh b/docker/common/cinder-app/cinder-backup/start.sh
new file mode 100755
index 000000000..5dff79b35
--- /dev/null
+++ b/docker/common/cinder-app/cinder-backup/start.sh
@@ -0,0 +1,36 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/kolla-common.sh
+. /opt/kolla/config-cinder.sh
+
+check_required_vars CINDER_BACKUP_DRIVER CINDER_BACKUP_MANAGER \
+ CINDER_BACKUP_API_CLASS CINDER_BACKUP_NAME_TEMPLATE
+
+cfg=/etc/cinder/cinder.conf
+
+# volume backup configuration
+crudini --set $cfg \
+ DEFAULT \
+ backup_driver \
+ "${CINDER_BACKUP_DRIVER}"
+crudini --set $cfg \
+ DEFAULT \
+ backup_topic \
+ "cinder-backup"
+crudini --set $cfg \
+ DEFAULT \
+ backup_manager \
+ "${CINDER_BACKUP_MANAGER}"
+crudini --set $cfg \
+ DEFAULT \
+ backup_api_class \
+ "${CINDER_BACKUP_API_CLASS}"
+crudini --set $cfg \
+ DEFAULT \
+ backup_name_template \
+ "${CINDER_BACKUP_NAME_TEMPLATE}"
+
+echo "Starting cinder-backup"
+exec /usr/bin/cinder-backup --config-file $cfg
diff --git a/docker/common/cinder-app/cinder-base/config-cinder.sh b/docker/common/cinder-app/cinder-base/config-cinder.sh
new file mode 100644
index 000000000..f82cb5510
--- /dev/null
+++ b/docker/common/cinder-app/cinder-base/config-cinder.sh
@@ -0,0 +1,132 @@
+#!/bin/sh
+
+set -e
+
+. /opt/kolla/kolla-common.sh
+
+check_required_vars CINDER_DB_PASSWORD CINDER_KEYSTONE_PASSWORD \
+ KEYSTONE_PUBLIC_SERVICE_HOST RABBITMQ_SERVICE_HOST \
+ GLANCE_API_SERVICE_HOST MARIADB_SERVICE_HOST \
+ RABBITMQ_SERVICE_HOST RABBITMQ_SERVICE_PORT \
+ RABBIT_USERID RABBIT_PASSWORD GLANCE_API_SERVICE_HOST \
+ GLANCE_API_SERVICE_PORT ADMIN_TENANT_NAME \
+ CINDER_DB_NAME CINDER_DB_USER CINDER_KEYSTONE_USER \
+ PUBLIC_IP KEYSTONE_AUTH_PROTOCOL CINDER_LOG_DIR
+
+dump_vars
+
+cat > /openrc <<EOF
+export OS_AUTH_URL="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_PUBLIC_SERVICE_HOST}:${KEYSTONE_PUBLIC_SERVICE_PORT}/v2.0"
+export OS_USERNAME="${CINDER_KEYSTONE_USER}"
+export OS_PASSWORD="${CINDER_KEYSTONE_PASSWORD}"
+export OS_TENANT_NAME="${ADMIN_TENANT_NAME}"
+EOF
+
+cfg=/etc/cinder/cinder.conf
+
+# Logging
+crudini --set $cfg \
+ DEFAULT \
+ log_dir \
+ "${CINDER_LOG_DIR}"
+crudini --set $cfg \
+ DEFAULT \
+ verbose \
+ "${VERBOSE_LOGGING}"
+crudini --set $cfg \
+ DEFAULT \
+ debug \
+ "${DEBUG_LOGGING}"
+
+# backend
+crudini --set $cfg \
+ DEFAULT \
+ rpc_backend \
+ "cinder.openstack.common.rpc.impl_kombu"
+
+# rabbit
+crudini --set $cfg \
+ DEFAULT \
+ rabbit_host \
+ "${RABBITMQ_SERVICE_HOST}"
+crudini --set $cfg \
+ DEFAULT \
+ rabbit_port \
+ "${RABBITMQ_SERVICE_PORT}"
+crudini --set $cfg \
+ DEFAULT \
+ rabbit_hosts \
+ "${RABBITMQ_SERVICE_HOST}:${RABBITMQ_SERVICE_PORT}"
+crudini --set $cfg \
+ DEFAULT \
+ rabbit_userid \
+ "${RABBIT_USERID}"
+crudini --set $cfg \
+ DEFAULT \
+ rabbit_password \
+ "${RABBIT_PASSWORD}"
+crudini --set /etc/cinder/cinder.conf \
+ DEFAULT \
+ rabbit_virtual_host \
+ "/"
+crudini --set /etc/cinder/cinder.conf \
+ DEFAULT \
+ rabbit_ha_queues \
+ "False"
+
+# control_exchange
+crudini --set /etc/cinder/cinder.conf \
+ DEFAULT \
+ control_exchange \
+ "openstack"
+
+# glance
+crudini --set $cfg \
+ DEFAULT \
+ glance_host \
+ "${GLANCE_API_SERVICE_HOST}"
+crudini --set $cfg \
+ DEFAULT \
+ glance_port \
+ "${GLANCE_API_SERVICE_PORT}"
+
+# database
+crudini --set $cfg \
+ database \
+ connection \
+ "mysql://${CINDER_DB_USER}:${CINDER_DB_PASSWORD}@${MARIADB_SERVICE_HOST}/${CINDER_DB_NAME}"
+
+# keystone
+crudini --set $cfg \
+ DEFAULT \
+ auth_strategy \
+ "keystone"
+crudini --del $cfg \
+ keystone_authtoken \
+ auth_protocol
+crudini --del $cfg \
+ keystone_authtoken \
+ auth_host
+crudini --del $cfg \
+ keystone_authtoken \
+ auth_port
+crudini --set $cfg \
+ keystone_authtoken \
+ auth_uri \
+ "${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_PUBLIC_SERVICE_HOST}:${KEYSTONE_PUBLIC_SERVICE_PORT}/v2.0"
+crudini --set $cfg \
+ keystone_authtoken \
+ identity_uri \
+ "${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}"
+crudini --set $cfg \
+ keystone_authtoken \
+ admin_tenant_name \
+ "${ADMIN_TENANT_NAME}"
+crudini --set $cfg \
+ keystone_authtoken \
+ admin_user \
+ "${CINDER_KEYSTONE_USER}"
+crudini --set $cfg \
+ keystone_authtoken \
+ admin_password \
+ "${CINDER_KEYSTONE_PASSWORD}"
diff --git a/docker/common/cinder-app/cinder-scheduler/start.sh b/docker/common/cinder-app/cinder-scheduler/start.sh
new file mode 100755
index 000000000..93efeb406
--- /dev/null
+++ b/docker/common/cinder-app/cinder-scheduler/start.sh
@@ -0,0 +1,32 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/kolla-common.sh
+. /opt/kolla/config-cinder.sh
+
+fail_unless_db
+
+check_required_vars MARIADB_SERVICE_HOST DB_ROOT_PASSWORD \
+ CINDER_DB_NAME CINDER_DB_USER CINDER_DB_PASSWORD \
+ CINDER_SCHEDULER_LOG_FILE INIT_CINDER_DB
+
+cfg=/etc/cinder/cinder.conf
+
+if [ "${INIT_CINDER_DB}" == "true" ]; then
+ mysql -h ${MARIADB_SERVICE_HOST} -u root -p${DB_ROOT_PASSWORD} mysql <<EOF
+CREATE DATABASE IF NOT EXISTS ${CINDER_DB_NAME};
+GRANT ALL PRIVILEGES ON ${CINDER_DB_NAME}.* TO
+'${CINDER_DB_USER}'@'%' IDENTIFIED BY '${CINDER_DB_PASSWORD}'
+EOF
+
+ su -s /bin/sh -c "cinder-manage db sync" cinder
+fi
+
+crudini --set $cfg \
+ DEFAULT \
+ log_file \
+ "${CINDER_SCHEDULER_LOG_FILE}"
+
+echo "Starting cinder-scheduler"
+exec /usr/bin/cinder-scheduler --config-file $cfg
diff --git a/docker/common/cinder-app/cinder-volume/start.sh b/docker/common/cinder-app/cinder-volume/start.sh
new file mode 100755
index 000000000..db29e75de
--- /dev/null
+++ b/docker/common/cinder-app/cinder-volume/start.sh
@@ -0,0 +1,75 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/kolla-common.sh
+. /opt/kolla/config-cinder.sh
+. /opt/kolla/volume-group-create.sh
+
+check_required_vars CINDER_VOLUME_API_LISTEN ISCSI_HELPER ISCSI_IP_ADDRESS \
+ CINDER_VOLUME_GROUP CINDER_LVM_LO_VOLUME_SIZE \
+ CINDER_VOLUME_BACKEND_NAME CINDER_VOLUME_DRIVER \
+ CINDER_ENABLED_BACKEND CINDER_VOLUME_LOG_FILE
+
+cfg=/etc/cinder/cinder.conf
+
+# Logging
+crudini --set $cfg \
+ DEFAULT \
+ log_file \
+ "${CINDER_VOLUME_LOG_FILE}"
+
+# IP address on which OpenStack Volume API listens
+crudini --set $cfg \
+ DEFAULT \
+ osapi_volume_listen \
+ "${CINDER_VOLUME_API_LISTEN}"
+
+# The IP address that the iSCSI daemon is listening on
+crudini --set $cfg \
+ DEFAULT \
+ iscsi_ip_address \
+ "${ISCSI_IP_ADDRESS}"
+
+# Set to false when using loopback devices (testing)
+crudini --set $cfg \
+ DEFAULT \
+ secure_delete \
+ "false"
+
+crudini --set $cfg \
+ DEFAULT \
+ enabled_backends \
+ "${CINDER_ENABLED_BACKEND}"
+
+crudini --set $cfg \
+ lvm57 \
+ iscsi_helper \
+ "${ISCSI_HELPER}"
+
+crudini --set $cfg \
+ lvm57 \
+ volume_group \
+ "${CINDER_VOLUME_GROUP}"
+
+crudini --set $cfg \
+ lvm57 \
+ volume_driver \
+ "${CINDER_VOLUME_DRIVER}"
+
+crudini --set $cfg \
+ lvm57 \
+ iscsi_ip_address \
+ "${ISCSI_IP_ADDRESS}"
+
+crudini --set $cfg \
+ lvm57 \
+ volume_backend_name \
+ "${CINDER_VOLUME_BACKEND_NAME}"
+
+sed -i 's/udev_sync = 1/udev_sync = 0/' /etc/lvm/lvm.conf
+sed -i 's/udev_rules = 1/udev_rules = 0/' /etc/lvm/lvm.conf
+sed -i 's/use_lvmetad = 1/use_lvmetad = 0/' /etc/lvm/lvm.conf
+
+echo "Starting cinder-volume"
+exec /usr/bin/cinder-volume --config-file /etc/cinder/cinder.conf
diff --git a/docker/common/cinder-app/cinder-volume/volume-group-create.sh b/docker/common/cinder-app/cinder-volume/volume-group-create.sh
new file mode 100755
index 000000000..908d987b0
--- /dev/null
+++ b/docker/common/cinder-app/cinder-volume/volume-group-create.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+# The script will create the cinder-volume volume group that will
+# allow cinder to create volumes from a backing file.
+# This is based off devstack.
+set -e
+
+backing_file=/opt/data/cinder_volume
+
+check_required_vars CINDER_LVM_LO_VOLUME_SIZE CINDER_VOLUME_GROUP
+
+if ! vgs ${CINDER_VOLUME_GROUP}; then
+ [[ ! -f $backing_file ]] && truncate -s ${CINDER_LVM_LO_VOLUMES_SIZE} $backing_file
+ vg_dev=`losetup -f --show $backing_file`
+ if ! vgs ${CINDER_VOLUME_GROUP}; then
+ vgcreate ${CINDER_VOLUME_GROUP} $vg_dev
+ fi
+fi
+
+# Remove iscsi targets
+cinder-rtstool get-targets | xargs -rn 1 cinder-rtstool delete
+
diff --git a/docker/common/designate/designate-api/start.sh b/docker/common/designate/designate-api/start.sh
new file mode 100755
index 000000000..aae50ea8f
--- /dev/null
+++ b/docker/common/designate/designate-api/start.sh
@@ -0,0 +1,37 @@
+#!/bin/bash
+set -e
+
+. /opt/kolla/kolla-common.sh
+. /opt/kolla/config-designate.sh
+
+CONF=/etc/designate/designate.conf
+
+check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
+ DESIGNATE_KEYSTONE_USER DESIGNATE_KEYSTONE_PASSWORD \
+ KEYSTONE_AUTH_PROTOCOL ADMIN_TENANT_NAME \
+ DESIGNATE_API_SERVICE_HOST DESIGNATE_API_SERVICE_PORT \
+ KEYSTONE_ADMIN_SERVICE_PORT
+
+export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
+export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v2.0"
+
+fail_unless_os_service_running keystone
+
+crux user-create \
+ -n ${DESIGNATE_KEYSTONE_USER} \
+ -p ${DESIGNATE_KEYSTONE_PASSWORD} \
+ -t ${ADMIN_TENANT_NAME} \
+ -r admin
+
+crux endpoint-create \
+ --remove-all \
+ -n ${DESIGNATE_KEYSTONE_USER} \
+ -t dns \
+ -I "${KEYSTONE_AUTH_PROTOCOL}://${DESIGNATE_API_SERVICE_HOST}:${DESIGNATE_API_SERVICE_PORT}/v1" \
+ -P "${KEYSTONE_AUTH_PROTOCOL}://${DESIGNATE_API_SERVICE_HOST}:${DESIGNATE_API_SERVICE_PORT}/v1" \
+ -A "${KEYSTONE_AUTH_PROTOCOL}://${DESIGNATE_API_SERVICE_HOST}:${DESIGNATE_API_SERVICE_PORT}/v1"
+
+crudini --set $CONF service:api api_paste_config "/usr/share/designate/api-paste.ini"
+crudini --set $CONF service:api api_port "${DESIGNATE_API_SERVICE_PORT}"
+
+exec /usr/bin/designate-api
diff --git a/docker/common/designate/designate-backend-bind9/start.sh b/docker/common/designate/designate-backend-bind9/start.sh
new file mode 100755
index 000000000..90d2de676
--- /dev/null
+++ b/docker/common/designate/designate-backend-bind9/start.sh
@@ -0,0 +1,60 @@
+#!/bin/bash
+set -e
+
+. /opt/kolla/kolla-common.sh
+
+check_required_vars DESIGNATE_MASTERNS DESIGNATE_SLAVENS DESIGNATE_BIND9_RNDC_KEY \
+ DESIGNATE_ALLOW_RECURSION
+
+NAMEDCFG=/etc/named.conf
+
+# /var/named is coming from a VOLUME definition but at first boot it needs to
+# be populated from the original container since else it would be missing some
+# Bind9 core files. These files have been saved during the build phase.
+
+if [ ! -f /var/named/named.ca ]; then
+ cp -pr /opt/kolla/var-named/* /var/named/
+fi
+
+# When rndc adds a new domain, bind adds the call in an nzf file in this
+# directory.
+chmod 770 /var/named
+chown root:named /var/named
+
+# Default Bind9 behavior is to enable recursion, disable if wanted.
+if [ "${DESIGNATE_ALLOW_RECURSION}" == "false" ]; then
+ sed -i -r "s/(recursion) yes/\1 no/" $NAMEDCFG
+fi
+
+sed -i -r "/listen-on port 53/d" $NAMEDCFG
+sed -i -r "/listen-on-v6/d" $NAMEDCFG
+sed -i -r "s,/\* Path to ISC DLV key \*/,allow-new-zones yes;," $NAMEDCFG
+sed -i -r "/allow-query .+;/d" $NAMEDCFG
+
+if ! grep -q rndc-key /etc/named.conf; then
+ cat >> /etc/named.conf <<EOF
+include "/etc/rndc.key";
+controls {
+ inet ${DESIGNATE_SLAVENS} allow { ${DESIGNATE_MASTERNS}; } keys { "rndc-key"; };
+};
+EOF
+fi
+
+cat > /etc/rndc.key <<EOF
+key "rndc-key" {
+ algorithm hmac-md5;
+ secret "${DESIGNATE_BIND9_RNDC_KEY}";
+};
+EOF
+cat > /etc/rndc.conf <<EOF
+options {
+ default-key "rndc-key";
+ default-server 127.0.0.1;
+ default-port 953;
+};
+EOF
+cat /etc/rndc.key >> /etc/rndc.conf
+chown named /etc/rndc.key
+
+# Launch and keep in the foreground.
+exec /usr/sbin/named -u named -g
diff --git a/docker/common/designate/designate-base/config-designate.sh b/docker/common/designate/designate-base/config-designate.sh
new file mode 100755
index 000000000..5a31401ee
--- /dev/null
+++ b/docker/common/designate/designate-base/config-designate.sh
@@ -0,0 +1,62 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/kolla-common.sh
+
+check_required_vars DESIGNATE_DB_PASSWORD DESIGNATE_KEYSTONE_PASSWORD \
+ KEYSTONE_PUBLIC_SERVICE_HOST RABBITMQ_SERVICE_HOST \
+ DESIGNATE_BIND9_RNDC_KEY DESIGNATE_BACKEND \
+ KEYSTONE_PUBLIC_SERVICE_PORT DESIGNATE_KEYSTONE_USER \
+ RABBIT_USERID RABBIT_PASSWORD DESIGNATE_DB_USER \
+ DESIGNATE_DB_NAME KEYSTONE_AUTH_PROTOCOL \
+ KEYSTONE_ADMIN_SERVICE_HOST KEYSTONE_ADMIN_SERVICE_PORT \
+ DEBUG_LOGGING DESIGNATE_POOLMAN_POOLID
+
+fail_unless_db
+dump_vars
+
+cat > /openrc <<EOF
+export OS_AUTH_URL="http://${KEYSTONE_PUBLIC_SERVICE_HOST}:${KEYSTONE_PUBLIC_SERVICE_PORT}/v2.0"
+export OS_USERNAME="${DESIGNATE_KEYSTONE_USER}"
+export OS_PASSWORD="${DESIGNATE_KEYSTONE_PASSWORD}"
+export OS_TENANT_NAME="${ADMIN_TENANT_NAME}"
+EOF
+
+conf=/etc/designate/designate.conf
+
+# Regular configuration.
+crudini --set $conf DEFAULT log_file ""
+crudini --set $conf DEFAULT use_stderr "True"
+crudini --set $conf DEFAULT debug "${DEBUG_LOGGING}"
+crudini --set $conf DEFAULT rpc_backend "designate.openstack.common.rpc.impl_kombu"
+
+crudini --set $conf oslo_messaging_rabbit rabbit_host "${RABBITMQ_SERVICE_HOST}"
+crudini --set $conf oslo_messaging_rabbit rabbit_userid "${RABBIT_USERID}"
+crudini --set $conf oslo_messaging_rabbit rabbit_password "${RABBIT_PASSWORD}"
+
+crudini --set $conf storage:sqlalchemy connection "mysql://${DESIGNATE_DB_USER}:${DESIGNATE_DB_PASSWORD}@${MARIADB_SERVICE_HOST}/${DESIGNATE_DB_NAME}"
+
+crudini --set $conf service:api auth_strategy "keystone"
+crudini --set $conf service:api api_host "${PUBLIC_IP}"
+
+# Eventhough this is a central-scoped item, it's used in other Designate
+# components as well. Thus it should be configured here, from designate-base.
+crudini --set $conf service:central default_pool_id "${DESIGNATE_POOLMAN_POOLID}"
+
+crudini --set $conf keystone_authtoken identity_uri "${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}"
+crudini --set $conf keystone_authtoken auth_uri "${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_PUBLIC_SERVICE_HOST}:${KEYSTONE_PUBLIC_SERVICE_PORT}/v2.0"
+crudini --set $conf keystone_authtoken admin_tenant_name "${ADMIN_TENANT_NAME}"
+crudini --set $conf keystone_authtoken admin_user "${DESIGNATE_KEYSTONE_USER}"
+crudini --set $conf keystone_authtoken admin_password "${DESIGNATE_KEYSTONE_PASSWORD}"
+
+if [ "${DESIGNATE_BACKEND}" == "bind9" ]; then
+ # Configure a key for RNDC so it can connect with Bind9 to create/delete
+ # zones.
+ cat > /etc/rndc.key <<EOF
+key "rndc-key" {
+ algorithm hmac-md5;
+ secret "${DESIGNATE_BIND9_RNDC_KEY}";
+};
+EOF
+fi
diff --git a/docker/common/designate/designate-central/start.sh b/docker/common/designate/designate-central/start.sh
new file mode 100755
index 000000000..fef7e2353
--- /dev/null
+++ b/docker/common/designate/designate-central/start.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+set -e
+
+. /opt/kolla/kolla-common.sh
+. /opt/kolla/config-designate.sh
+
+check_required_vars MARIADB_SERVICE_HOST DB_ROOT_PASSWORD DESIGNATE_DB_NAME \
+ DESIGNATE_DB_USER DESIGNATE_DB_PASSWORD DESIGNATE_INITDB
+
+fail_unless_db
+
+CONF=/etc/designate/designate.conf
+
+if [ "${DESIGNATE_INITDB}" == "true" ]; then
+ echo "Configuring database"
+ mysql -h ${MARIADB_SERVICE_HOST} -u root -p"${DB_ROOT_PASSWORD}" mysql <<EOF
+CREATE DATABASE IF NOT EXISTS ${DESIGNATE_DB_NAME};
+GRANT ALL PRIVILEGES ON ${DESIGNATE_DB_NAME}.* TO '${DESIGNATE_DB_USER}'@'%' IDENTIFIED BY '${DESIGNATE_DB_PASSWORD}'
+EOF
+
+ designate-manage database sync
+fi
+
+exec /usr/bin/designate-central
diff --git a/docker/common/designate/designate-mdns/start.sh b/docker/common/designate/designate-mdns/start.sh
new file mode 100755
index 000000000..a3e5df274
--- /dev/null
+++ b/docker/common/designate/designate-mdns/start.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+set -e
+
+. /opt/kolla/kolla-common.sh
+. /opt/kolla/config-designate.sh
+
+check_required_vars DESIGNATE_MASTERNS DESIGNATE_MDNS_PORT
+
+CONF=/etc/designate/designate.conf
+
+crudini --set $CONF service:mdns workers "1"
+crudini --set $CONF service:mdns host "${DESIGNATE_MASTERNS}"
+crudini --set $CONF service:mdns port "${DESIGNATE_MDNS_PORT}"
+crudini --set $CONF service:mdns tcp_backlog "100"
+crudini --set $CONF service:mdns all_tcp "False"
+
+exec /usr/bin/designate-mdns
diff --git a/docker/common/designate/designate-poolmanager/start.sh b/docker/common/designate/designate-poolmanager/start.sh
new file mode 100755
index 000000000..f5222b3f4
--- /dev/null
+++ b/docker/common/designate/designate-poolmanager/start.sh
@@ -0,0 +1,54 @@
+#!/bin/bash
+set -e
+
+. /opt/kolla/kolla-common.sh
+. /opt/kolla/config-designate.sh
+
+check_required_vars DESIGNATE_MASTERNS DESIGNATE_BACKEND DESIGNATE_SLAVENS \
+ DESIGNATE_MDNS_PORT DESIGNATE_DNS_PORT DESIGNATE_POOLMAN_POOLID \
+ DESIGNATE_POOLMAN_TARGETS DESIGNATE_POOLMAN_NSS \
+ DESIGNATE_POOLMAN_POOLID
+
+CONF=/etc/designate/designate.conf
+
+if [ "${DESIGNATE_BACKEND}" == "bind9" ]; then
+ TYPE="bind9"
+ OPTIONS="rndc_host: ${DESIGNATE_SLAVENS}, rndc_key_file: /etc/rndc.key"
+else
+ echo Unsupported backend: ${DESIGNATE_BACKEND}
+ exit
+fi
+
+crudini --set $CONF service:pool_manager workers "1"
+crudini --set $CONF service:pool_manager enable_recovery_timer "False"
+crudini --set $CONF service:pool_manager periodic_recovery_interval "120"
+crudini --set $CONF service:pool_manager enable_sync_timer "True"
+crudini --set $CONF service:pool_manager periodic_sync_interval "1800"
+crudini --set $CONF service:pool_manager poll_max_retries "10"
+crudini --set $CONF service:pool_manager poll_delay "5"
+crudini --set $CONF service:pool_manager poll_retry_interval "15"
+crudini --set $CONF service:pool_manager pool_id "${DESIGNATE_POOLMAN_POOLID}"
+crudini --set $CONF service:pool_manager cache_driver "noop"
+
+# TODO: use this to use memcached
+#crudini --set $CONF service:pool_manager cache_driver memcache
+#crudini --set $CONF service:pool_manager memcached_servers ${MEMCACHED_HOST}
+
+# Specify the id of the pool managed through pool_manager. Central gets
+# configured with this pool_id as well.
+crudini --set $CONF service:pool_manager pool_id "${DESIGNATE_POOLMAN_POOLID}"
+
+crudini --set $CONF pool:${DESIGNATE_POOLMAN_POOLID} nameservers "${DESIGNATE_POOLMAN_NSS}"
+crudini --set $CONF pool:${DESIGNATE_POOLMAN_POOLID} targets "${DESIGNATE_POOLMAN_TARGETS}"
+
+crudini --set $CONF pool_target:${DESIGNATE_POOLMAN_TARGETS} type "${TYPE}"
+crudini --set $CONF pool_target:${DESIGNATE_POOLMAN_TARGETS} options "${OPTIONS}"
+# This is the mdns container, which is the master nameserver.
+crudini --set $CONF pool_target:${DESIGNATE_POOLMAN_TARGETS} masters "${DESIGNATE_MASTERNS}:${DESIGNATE_MDNS_PORT}"
+crudini --set $CONF pool_target:${DESIGNATE_POOLMAN_TARGETS} host "${DESIGNATE_MASTERNS}"
+crudini --set $CONF pool_target:${DESIGNATE_POOLMAN_TARGETS} port "${DESIGNATE_DNS_PORT}"
+
+crudini --set $CONF pool_nameserver:${DESIGNATE_POOLMAN_NSS} host "${DESIGNATE_MASTERNS}"
+crudini --set $CONF pool_nameserver:${DESIGNATE_POOLMAN_NSS} port "${DESIGNATE_DNS_PORT}"
+
+exec /usr/bin/designate-pool-manager
diff --git a/docker/common/galera/config-galera.sh b/docker/common/galera/config-galera.sh
new file mode 100755
index 000000000..f0ab542e1
--- /dev/null
+++ b/docker/common/galera/config-galera.sh
@@ -0,0 +1,94 @@
+#!/bin/bash
+
+. /opt/kolla/kolla-common.sh
+
+check_required_vars DB_CLUSTER_BIND_ADDRESS DB_CLUSTER_NAME DB_CLUSTER_NODES \
+ DB_ROOT_PASSWORD DB_CLUSTER_WSREP_METHOD
+
+CFG=/etc/my.cnf.d/server.cnf
+DB_CLUSTER_INIT_SQL=/tmp/mysql-first-time.sql
+
+function configure_files {
+ crudini --set $CFG mariadb bind-address "${DB_CLUSTER_BIND_ADDRESS}"
+ crudini --set $CFG mariadb binlog_format "ROW"
+ crudini --set $CFG mariadb character-set-server "utf8"
+ crudini --set $CFG mariadb collation-server "utf8_general_ci"
+ crudini --set $CFG mariadb datadir "/var/lib/mysql"
+ crudini --set $CFG mariadb default-storage-engine "innodb"
+ crudini --set $CFG mariadb init-connect "'SET NAMES utf8'"
+ crudini --set $CFG mariadb innodb_autoinc_lock_mode "2"
+ crudini --set $CFG mariadb innodb_file_per_table 1
+ crudini --set $CFG mariadb innodb_flush_log_at_trx_commit "2"
+ crudini --set $CFG mariadb innodb_locks_unsafe_for_binlog "1"
+ crudini --set $CFG mariadb innodb_log_file_size "100M"
+ crudini --set $CFG mariadb query_cache_size "0"
+ crudini --set $CFG mariadb query_cache_type "0"
+ crudini --set $CFG mariadb wsrep_cluster_address "gcomm://${DB_CLUSTER_NODES}"
+ crudini --set $CFG mariadb wsrep_cluster_name "${DB_CLUSTER_NAME}"
+ crudini --set $CFG mariadb wsrep_provider "/usr/lib64/galera/libgalera_smm.so"
+ crudini --set $CFG mariadb wsrep_sst_auth "'root:${DB_ROOT_PASSWORD}'"
+ crudini --set $CFG mariadb wsrep_sst_method "${DB_CLUSTER_WSREP_METHOD}"
+}
+
+function bootstrap_database() {
+ mysqld_safe &
+ # Waiting for deamon
+ sleep 10
+ expect -c '
+ set timeout 10
+ spawn mysql_secure_installation
+ expect "Enter current password for root (enter for none):"
+ send "\r"
+ expect "Set root password?"
+ send "y\r"
+ expect "New password:"
+ send "'"${DB_ROOT_PASSWORD}"'\r"
+ expect "Re-enter new password:"
+ send "'"${DB_ROOT_PASSWORD}"'\r"
+ expect "Remove anonymous users?"
+ send "y\r"
+ expect "Disallow root login remotely?"
+ send "n\r"
+ expect "Remove test database and access to it?"
+ send "y\r"
+ expect "Reload privilege tables now?"
+ send "y\r"
+ expect eof'
+ mysqladmin -p"${DB_ROOT_PASSWORD}" shutdown
+}
+
+function configure_db {
+ bootstrap_database
+
+ echo "GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY '$DB_ROOT_PASSWORD' ;" > $DB_CLUSTER_INIT_SQL
+
+ if [ "$MARIADB_DATABASE" ]; then
+ echo "CREATE DATABASE IF NOT EXISTS $MARIADB_DATABASE ;" >> $DB_CLUSTER_INIT_SQL
+ fi
+
+ if [ "$MARIADB_USER" -a "$MARIADB_PASSWORD" ]; then
+ echo "CREATE USER '$MARIADB_USER'@'%' IDENTIFIED BY '$MARIADB_PASSWORD' ;" >> $DB_CLUSTER_INIT_SQL
+
+ if [ "$MARIADB_DATABASE" ]; then
+ echo "GRANT ALL ON $MARIADB_DATABASE.* TO '$MARIADB_USER'@'%' ;" >> $DB_CLUSTER_INIT_SQL
+ fi
+ fi
+
+ echo "FLUSH PRIVILEGES" >> $DB_CLUSTER_INIT_SQL
+}
+
+function populate_db {
+ if [[ $(ls /var/lib/mysql) == "" ]]; then
+ echo "POPULATING NEW DB"
+ mysql_install_db
+ chown -R mysql /var/lib/mysql
+ else
+ echo "DB ALREADY EXISTS"
+ fi
+}
+
+function prepare_db {
+ populate_db
+ configure_db
+ configure_files
+}
diff --git a/docker/common/galera/start.sh b/docker/common/galera/start.sh
new file mode 100755
index 000000000..9288b77cc
--- /dev/null
+++ b/docker/common/galera/start.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+. /opt/kolla/kolla-common.sh
+. /opt/kolla/config-galera.sh
+
+check_required_vars DB_CLUSTER_INIT_DB
+prepare_db
+
+if [[ "${DB_CLUSTER_INIT_DB}" == "true" ]] && ! [[ -a /var/lib/mysql/cluster.exists ]]; then
+ DB_CLUSTER_IS_MASTER_NODE="--wsrep-new-cluster"
+ touch /var/lib/mysql/cluster.exists
+fi
+
+mysqld_safe --init-file=$DB_CLUSTER_INIT_SQL $DB_CLUSTER_IS_MASTER_NODE \ No newline at end of file
diff --git a/docker/common/glance/glance-api/check.sh b/docker/common/glance/glance-api/check.sh
new file mode 100755
index 000000000..f97ef70f4
--- /dev/null
+++ b/docker/common/glance/glance-api/check.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+RES=0
+
+. /openrc
+if ! keystone token-get > /dev/null; then
+ echo "ERROR: keystone token-get failed" >&2
+ RES=1
+else
+ if ! glance image-list > /dev/null; then
+ echo "ERROR: glance image-list failed" >&2
+ RES=1
+ fi
+fi
+
+exit $RES
+
diff --git a/docker/common/glance/glance-api/start.sh b/docker/common/glance/glance-api/start.sh
new file mode 100755
index 000000000..c546333f4
--- /dev/null
+++ b/docker/common/glance/glance-api/start.sh
@@ -0,0 +1,52 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/kolla-common.sh
+. /opt/kolla/config-glance.sh
+: ${GLANCE_API_SERVICE_HOST:=$PUBLIC_IP}
+
+check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
+ GLANCE_KEYSTONE_USER GLANCE_KEYSTONE_PASSWORD \
+ ADMIN_TENANT_NAME GLANCE_API_SERVICE_HOST \
+ PUBLIC_IP
+
+fail_unless_os_service_running keystone
+
+export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
+export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v2.0"
+
+crux user-create --update \
+ -n "${GLANCE_KEYSTONE_USER}" \
+ -p "${GLANCE_KEYSTONE_PASSWORD}" \
+ -t "${ADMIN_TENANT_NAME}" \
+ -r admin
+
+crux endpoint-create --remove-all \
+ -n glance -t image \
+ -I "http://${GLANCE_API_SERVICE_HOST}:9292" \
+ -P "http://${PUBLIC_IP}:9292" \
+ -A "http://${GLANCE_API_SERVICE_HOST}:9292"
+
+# turn on notification sending by glance
+crudini --set /etc/glance/glance-api.conf \
+ DEFAULT \
+ notification_driver \
+ "messaging"
+
+crudini --set /etc/glance/glance-api.conf \
+ DEFAULT \
+ rabbit_host \
+ "${RABBITMQ_SERVICE_HOST}"
+
+crudini --set /etc/glance/glance-api.conf \
+ DEFAULT \
+ registry_host \
+ "${GLANCE_REGISTRY_SERVICE_HOST}"
+
+crudini --set /etc/glance/glance-api.conf \
+ DEFAULT \
+ debug \
+ "True"
+
+exec /usr/bin/glance-api
diff --git a/docker/common/glance/glance-base/config-glance.sh b/docker/common/glance/glance-base/config-glance.sh
new file mode 100644
index 000000000..97d076c11
--- /dev/null
+++ b/docker/common/glance/glance-base/config-glance.sh
@@ -0,0 +1,63 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/kolla-common.sh
+
+: ${ADMIN_TENANT_NAME:=admin}
+: ${GLANCE_DB_NAME:=glance}
+: ${GLANCE_DB_USER:=glance}
+: ${GLANCE_KEYSTONE_USER:=glance}
+: ${KEYSTONE_AUTH_PROTOCOL:=http}
+: ${PUBLIC_IP:=$GLANCE_API_PORT_9292_TCP_ADDR}
+
+check_required_vars GLANCE_DB_PASSWORD GLANCE_KEYSTONE_PASSWORD
+dump_vars
+
+cat > /openrc <<EOF
+export OS_AUTH_URL="http://${KEYSTONE_PUBLIC_SERVICE_HOST}:5000/v2.0"
+export OS_USERNAME="${GLANCE_KEYSTONE_USER}"
+export OS_PASSWORD="${GLANCE_KEYSTONE_PASSWORD}"
+export OS_TENANT_NAME="${ADMIN_TENANT_NAME}"
+EOF
+
+for cfg in /etc/glance/glance-api.conf /etc/glance/glance-registry.conf; do
+ crudini --set $cfg \
+ DEFAULT \
+ log_file \
+ ""
+
+ for option in auth_protocol auth_host auth_port; do
+ crudini --del $cfg \
+ keystone_authtoken \
+ $option
+ done
+
+ crudini --set $cfg \
+ keystone_authtoken \
+ auth_uri \
+ "http://${KEYSTONE_PUBLIC_SERVICE_HOST}:5000/"
+ crudini --set $cfg \
+ keystone_authtoken \
+ admin_tenant_name \
+ "${ADMIN_TENANT_NAME}"
+ crudini --set $cfg \
+ keystone_authtoken \
+ admin_user \
+ "${GLANCE_KEYSTONE_USER}"
+ crudini --set $cfg \
+ keystone_authtoken \
+ admin_password \
+ "${GLANCE_KEYSTONE_PASSWORD}"
+
+ crudini --set $cfg \
+ paste_deploy \
+ flavor \
+ keystone
+
+ crudini --set $cfg \
+ database \
+ connection \
+ "mysql://${GLANCE_DB_USER}:${GLANCE_DB_PASSWORD}@${MARIADB_SERVICE_HOST}/${GLANCE_DB_NAME}"
+done
+
diff --git a/docker/common/glance/glance-registry/start.sh b/docker/common/glance/glance-registry/start.sh
new file mode 100755
index 000000000..5f590fb1c
--- /dev/null
+++ b/docker/common/glance/glance-registry/start.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/kolla-common.sh
+. /opt/kolla/config-glance.sh
+
+check_required_vars GLANCE_DB_NAME GLANCE_DB_USER GLANCE_DB_PASSWORD
+# lets wait for the DB to be available
+wait_for 25 1 check_for_db
+
+mysql -h ${MARIADB_SERVICE_HOST} -u root -p${DB_ROOT_PASSWORD} mysql <<EOF
+CREATE DATABASE IF NOT EXISTS ${GLANCE_DB_NAME} DEFAULT CHARACTER SET utf8;
+GRANT ALL PRIVILEGES ON ${GLANCE_DB_NAME}.* TO
+ '${GLANCE_DB_USER}'@'%' IDENTIFIED BY '${GLANCE_DB_PASSWORD}'
+
+EOF
+
+/usr/bin/glance-manage db_sync
+
+exec /usr/bin/glance-registry
diff --git a/docker/common/hautoproxy/haproxy.cfg.tmpl b/docker/common/hautoproxy/haproxy.cfg.tmpl
new file mode 100644
index 000000000..cd1174b21
--- /dev/null
+++ b/docker/common/hautoproxy/haproxy.cfg.tmpl
@@ -0,0 +1,26 @@
+global
+ daemon
+ maxconn 4096
+ pidfile /var/run/haproxy.pid
+
+defaults
+ mode tcp
+ timeout connect 5s
+ timeout client 1m
+ timeout server 1m
+ option redispatch
+ balance roundrobin
+
+listen stats :1936
+ mode http
+ stats enable
+ stats hide-version
+ #stats realm Haproxy\ Statistics
+ stats uri /
+ #stats auth Username:Password
+
+{% for service in services %}
+listen {{ service.service_name }}
+ bind 127.0.0.1:{{service.local_port}}
+ server {{ service.remote_name }} {{ service.remote_addr }}:{{ service.remote_port}} check inter 2s rise 3 fall 2
+{% endfor %}
diff --git a/docker/common/hautoproxy/start.py b/docker/common/hautoproxy/start.py
new file mode 100755
index 000000000..877b22157
--- /dev/null
+++ b/docker/common/hautoproxy/start.py
@@ -0,0 +1,65 @@
+#!/usr/bin/python
+
+'''This script configures and starts a local haproxy instances, bound to
+127.0.0.1, that forwards connections all of the discovered
+docker/kubernetes environment variables.'''
+
+import argparse
+import os
+import sys
+from jinja2 import Environment, FileSystemLoader
+import re
+import urlparse
+
+re_url = re.compile(
+ '^(?P<name>.*)_PORT_(?P<port>\d+)_(?P<proto>(UDP|TCP))$')
+
+def parse_args():
+ p = argparse.ArgumentParser()
+ p.add_argument('--output', '-o',
+ default='/etc/haproxy/haproxy.cfg')
+ p.add_argument('--no-start', '-n',
+ action='store_true')
+ p.add_argument('--template-dir', '-t',
+ default='/etc/haproxy/templates')
+ return p.parse_args()
+
+def discover_services():
+ services = []
+ for k in os.environ:
+ mo = re_url.match(k)
+
+ if mo:
+ parts = urlparse.urlparse(os.environ[k])
+ remote_host,remote_port = parts.netloc.split(':')
+ service_name = '%(name)s-%(port)s' % mo.groupdict()
+
+ services.append({
+ 'remote_name': mo.group('name'),
+ 'remote_addr': remote_host,
+ 'remote_port': remote_port,
+ 'remote_proto': parts.scheme,
+ 'local_port': mo.group('port'),
+ 'service_name': service_name,
+ })
+
+ return services
+
+def main():
+ args = parse_args()
+ services = discover_services()
+
+ env = Environment(loader=FileSystemLoader(['.',
+ args.template_dir]))
+ template = env.get_template('haproxy.cfg.tmpl')
+ with open(args.output, 'w') as fd:
+ fd.write(template.render(services=services))
+
+ if args.no_start:
+ return
+
+ os.execlp('haproxy', 'haproxy', '-f', args.output, '-db')
+
+if __name__ == '__main__':
+ main()
+
diff --git a/docker/common/heat/heat-api-cfn/check.sh b/docker/common/heat/heat-api-cfn/check.sh
new file mode 100755
index 000000000..ee03dc6d2
--- /dev/null
+++ b/docker/common/heat/heat-api-cfn/check.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+RES=0
+
+. /openrc
+if ! keystone token-get > /dev/null; then
+ echo "ERROR: keystone token-get failed" >&2
+ RES=1
+else
+ if ! heat stack-list > /dev/null; then
+ echo "ERROR: heat stack-list failed" >&2
+ RES=1
+ fi
+fi
+
+exit $RES
diff --git a/docker/common/heat/heat-api-cfn/start.sh b/docker/common/heat/heat-api-cfn/start.sh
new file mode 100755
index 000000000..bcd72250b
--- /dev/null
+++ b/docker/common/heat/heat-api-cfn/start.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+set -e
+
+. /opt/kolla/kolla-common.sh
+. /opt/kolla/config-heat.sh
+
+check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
+ HEAT_CFN_KEYSTONE_USER HEAT_CFN_KEYSTONE_PASSWORD \
+ KEYSTONE_AUTH_PROTOCOL KEYSTONE_ADMIN_SERVICE_PORT \
+ ADMIN_TENANT_NAME HEAT_API_CFN_SERVICE_HOST \
+ HEAT_API_CFN_SERVICE_PORT
+
+fail_unless_os_service_running keystone
+
+export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
+export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v2.0"
+
+crux user-create -n ${HEAT_CFN_KEYSTONE_USER} \
+ -p ${HEAT_CFN_KEYSTONE_PASSWORD} \
+ -t ${ADMIN_TENANT_NAME} \
+ -r admin
+
+crux endpoint-create --remove-all -n ${HEAT_CFN_KEYSTONE_USER} -t cloudformation \
+ -I "${KEYSTONE_AUTH_PROTOCOL}://${HEAT_API_CFN_SERVICE_HOST}:${HEAT_API_CFN_SERVICE_PORT}/v1" \
+ -P "${KEYSTONE_AUTH_PROTOCOL}://${HEAT_API_CFN_SERVICE_HOST}:${HEAT_API_CFN_SERVICE_PORT}/v1" \
+ -A "${KEYSTONE_AUTH_PROTOCOL}://${HEAT_API_CFN_SERVICE_HOST}:${HEAT_API_CFN_SERVICE_PORT}/v1"
+
+exec /usr/bin/heat-api-cfn
diff --git a/docker/common/heat/heat-api/check.sh b/docker/common/heat/heat-api/check.sh
new file mode 100755
index 000000000..ee03dc6d2
--- /dev/null
+++ b/docker/common/heat/heat-api/check.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+RES=0
+
+. /openrc
+if ! keystone token-get > /dev/null; then
+ echo "ERROR: keystone token-get failed" >&2
+ RES=1
+else
+ if ! heat stack-list > /dev/null; then
+ echo "ERROR: heat stack-list failed" >&2
+ RES=1
+ fi
+fi
+
+exit $RES
diff --git a/docker/common/heat/heat-api/start.sh b/docker/common/heat/heat-api/start.sh
new file mode 100755
index 000000000..b57aaa710
--- /dev/null
+++ b/docker/common/heat/heat-api/start.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+set -e
+
+. /opt/kolla/kolla-common.sh
+. /opt/kolla/config-heat.sh
+
+check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
+ HEAT_KEYSTONE_USER HEAT_KEYSTONE_PASSWORD \
+ KEYSTONE_AUTH_PROTOCOL ADMIN_TENANT_NAME \
+ HEAT_API_SERVICE_HOST PUBLIC_IP
+
+fail_unless_os_service_running keystone
+
+export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
+export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:35357/v2.0"
+crux user-create -n ${HEAT_KEYSTONE_USER} \
+ -p ${HEAT_KEYSTONE_PASSWORD} \
+ -t ${ADMIN_TENANT_NAME} \
+ -r admin
+
+crux endpoint-create --remove-all -n ${HEAT_KEYSTONE_USER} -t orchestration \
+ -I "${KEYSTONE_AUTH_PROTOCOL}://${HEAT_API_SERVICE_HOST}:8004/v1/%(tenant_id)s" \
+ -P "${KEYSTONE_AUTH_PROTOCOL}://${PUBLIC_IP}:8004/v1/%(tenant_id)s" \
+ -A "${KEYSTONE_AUTH_PROTOCOL}://${HEAT_API_SERVICE_HOST}:8004/v1/%(tenant_id)s"
+
+# will use crux after https://github.com/larsks/crux/issues/1 is implemented
+openstack role list --os-token="${KEYSTONE_ADMIN_TOKEN}" --os-url $SERVICE_ENDPOINT -f csv | tail -n +2 | awk -F, '{print $2}' | grep heat_stack_user || keystone role-create --name heat_stack_user
+
+exec /usr/bin/heat-api
diff --git a/docker/common/heat/heat-base/config-heat.sh b/docker/common/heat/heat-base/config-heat.sh
new file mode 100755
index 000000000..74b2718a4
--- /dev/null
+++ b/docker/common/heat/heat-base/config-heat.sh
@@ -0,0 +1,67 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/kolla-common.sh
+
+: ${ADMIN_TENANT_NAME:=admin}
+: ${HEAT_DB_NAME:=heat}
+: ${HEAT_DB_USER:=heat}
+: ${HEAT_KEYSTONE_USER:=heat}
+: ${HEAT_CFN_KEYSTONE_USER:=heat_cfn}
+: ${KEYSTONE_AUTH_PROTOCOL:=http}
+: ${PUBLIC_IP:=$HEAT_API_PORT_8004_TCP_ADDR}
+: ${RABBIT_USER:=guest}
+: ${RABBIT_PASSWORD:=guest}
+
+check_required_vars HEAT_DB_PASSWORD HEAT_KEYSTONE_PASSWORD \
+ KEYSTONE_PUBLIC_SERVICE_HOST RABBITMQ_SERVICE_HOST
+
+fail_unless_db
+dump_vars
+
+cat > /openrc <<EOF
+export OS_AUTH_URL="http://${KEYSTONE_PUBLIC_SERVICE_HOST}:5000/v2.0"
+export OS_USERNAME="${HEAT_KEYSTONE_USER}"
+export OS_PASSWORD="${HEAT_KEYSTONE_PASSWORD}"
+export OS_TENANT_NAME="${ADMIN_TENANT_NAME}"
+EOF
+
+crudini --set /etc/heat/heat.conf DEFAULT log_file \
+ ""
+crudini --set /etc/heat/heat.conf DEFAULT use_stderr \
+ true
+crudini --set /etc/heat/heat.conf DEFAULT rpc_backend \
+ heat.openstack.common.rpc.impl_kombu
+crudini --set /etc/heat/heat.conf DEFAULT rabbit_host \
+ "${RABBITMQ_SERVICE_HOST}"
+crudini --set /etc/heat/heat.conf DEFAULT rabbit_userid \
+ "${RABBIT_USER}"
+crudini --set /etc/heat/heat.conf DEFAULT rabbit_password \
+ "${RABBIT_PASSWORD}"
+
+crudini --set /etc/heat/heat.conf database connection \
+ mysql://${HEAT_DB_USER}:${HEAT_DB_PASSWORD}@${MARIADB_SERVICE_HOST}/${HEAT_DB_NAME}
+
+crudini --set /etc/heat/heat.conf keystone_authtoken auth_protocol \
+ "${KEYSTONE_AUTH_PROTOCOL}"
+crudini --set /etc/heat/heat.conf keystone_authtoken auth_host \
+ "${KEYSTONE_PUBLIC_SERVICE_HOST}"
+crudini --set /etc/heat/heat.conf keystone_authtoken auth_port \
+ "${KEYSTONE_PUBLIC_SERVICE_PORT}"
+crudini --set /etc/heat/heat.conf keystone_authtoken auth_uri \
+ "${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_PUBLIC_SERVICE_HOST}:${KEYSTONE_PUBLIC_SERVICE_PORT}/v2.0"
+crudini --set /etc/heat/heat.conf keystone_authtoken admin_tenant_name \
+ "${ADMIN_TENANT_NAME}"
+crudini --set /etc/heat/heat.conf keystone_authtoken admin_user \
+ "${HEAT_KEYSTONE_USER}"
+crudini --set /etc/heat/heat.conf keystone_authtoken admin_password \
+ "${HEAT_KEYSTONE_PASSWORD}"
+
+crudini --set /etc/heat/heat.conf ec2authtoken auth_uri \
+ "${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_PUBLIC_SERVICE_HOST}:${KEYSTONE_PUBLIC_SERVICE_PORT}/v2.0"
+
+crudini --set /etc/heat/heat.conf DEFAULT heat_metadata_server_url \
+ http://${HEAT_API_CFN_URL_HOST}:${HEAT_API_CFN_SERVICE_PORT}
+crudini --set /etc/heat/heat.conf DEFAULT heat_waitcondition_server_url \
+ http://${HEAT_API_CFN_URL_HOST}:${HEAT_API_CFN_SERVICE_PORT}/v1/waitcondition
diff --git a/docker/common/heat/heat-engine/start.sh b/docker/common/heat/heat-engine/start.sh
new file mode 100755
index 000000000..2dfc78e92
--- /dev/null
+++ b/docker/common/heat/heat-engine/start.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+. /opt/kolla/kolla-common.sh
+. /opt/kolla/config-heat.sh
+
+check_required_vars HEAT_DB_NAME HEAT_DB_USER HEAT_DB_PASSWORD
+fail_unless_db
+
+mysql -h ${MARIADB_SERVICE_HOST} -u root -p${DB_ROOT_PASSWORD} mysql <<EOF
+CREATE DATABASE IF NOT EXISTS ${HEAT_DB_NAME} DEFAULT CHARACTER SET utf8;
+GRANT ALL PRIVILEGES ON ${HEAT_DB_NAME}.* TO
+ '${HEAT_DB_USER}'@'%' IDENTIFIED BY '${HEAT_DB_PASSWORD}'
+EOF
+
+/usr/bin/heat-manage db_sync
+
+exec /usr/bin/heat-engine
diff --git a/docker/common/horizon/start.sh b/docker/common/horizon/start.sh
new file mode 100755
index 000000000..4e720bb87
--- /dev/null
+++ b/docker/common/horizon/start.sh
@@ -0,0 +1,36 @@
+#!/bin/bash
+set -e
+
+: ${HORIZON_KEYSTONE_USER:=horizon}
+
+. /opt/kolla/kolla-common.sh
+
+fail_unless_os_service_running keystone
+fail_unless_os_service_running glance
+fail_unless_os_service_running nova
+
+export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
+export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:35357/v2.0"
+
+cfg=/etc/openstack-dashboard/local_settings
+httpdcfg=/etc/httpd/conf.d/openstack-dashboard.conf
+
+sed -ri 's/ALLOWED_HOSTS = \['\''horizon.example.com'\'', '\''localhost'\''\]/ALLOWED_HOSTS = \['\''*'\'', \]/' /etc/openstack-dashboard/local_settings
+
+sed -ri 's/OPENSTACK_KEYSTONE_URL = \"http:\/\/%s:5000\/v2.0\" % OPENSTACK_HOST/OPENSTACK_KEYSTONE_URL = \"http:\/\/'"$KEYSTONE_PUBLIC_SERVICE_HOST"':5000\/v2.0\"/' /etc/openstack-dashboard/local_settings
+
+sed -ri 's/OPENSTACK_HOST = \"127.0.0.1\"/OPENSTACK_HOST = \"'"$KEYSTONE_PUBLIC_SERVICE_HOST"'\" /' /etc/openstack-dashboard/local_settings
+
+# Make sure we launch horizon using the default value for WEBROOT, which is
+# '/'.
+sed -ri '/^WEBROOT =.+/d' $cfg
+sed -ri 's,^(WSGIScriptAlias) /dashboard (/usr/share/openstack-dashboard/openstack_dashboard/wsgi/django.wsgi),\1 / \2,' $httpdcfg
+sed -ri 's,^(Alias /dashboard)(/static /usr/share/openstack-dashboard/static),Alias \2,' $httpdcfg
+
+# This step is required because of:
+# https://bugzilla.redhat.com/show_bug.cgi?id=1220070
+# Running this in the Dockerfile didn't fix the HTTP/500 as a result of the
+# missing compress action.
+python /usr/share/openstack-dashboard/manage.py compress
+
+/usr/sbin/httpd -DFOREGROUND
diff --git a/docker/common/keystone/check.sh b/docker/common/keystone/check.sh
new file mode 100755
index 000000000..ca4844784
--- /dev/null
+++ b/docker/common/keystone/check.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+RES=0
+
+. /openrc
+if ! keystone token-get > /dev/null; then
+ echo "ERROR: keystone token-get failed" >&2
+ RES=1
+fi
+
+exit $RES
+
diff --git a/docker/common/keystone/start.sh b/docker/common/keystone/start.sh
new file mode 100755
index 000000000..6dfebe060
--- /dev/null
+++ b/docker/common/keystone/start.sh
@@ -0,0 +1,162 @@
+#!/bin/bash
+
+set -e
+
+# Run Kolla common script
+echo "Running the kolla-common script"
+. /opt/kolla/kolla-common.sh
+
+# Credentials, token, etc..
+: ${ADMIN_USER:=admin}
+: ${ADMIN_USER_PASSWORD:=password}
+: ${ADMIN_TENANT_NAME:=admin}
+: ${KEYSTONE_USER:=keystone}
+: ${KEYSTONE_ADMIN_PASSWORD:=password}
+: ${KEYSTONE_ADMIN_TOKEN:=changeme}
+# DB Settings
+: ${INIT_DB:=true}
+: ${KEYSTONE_DB_NAME:=keystone}
+: ${KEYSTONE_DB_USER:=keystone}
+: ${DB_ROOT_PASSWORD:=password}
+: ${MARIADB_SERVICE_HOST:=$PUBLIC_IP}
+: ${KEYSTONE_DB_PASSWORD:=password}
+# Service Addresses/Ports/Version
+: ${KEYSTONE_PUBLIC_SERVICE_HOST:=$PUBLIC_IP}
+: ${KEYSTONE_ADMIN_SERVICE_HOST:=$PUBLIC_IP}
+: ${KEYSTONE_PUBLIC_SERVICE_PORT:=5000}
+: ${KEYSTONE_ADMIN_SERVICE_PORT:=35357}
+: ${KEYSTONE_API_VERSION:=2.0}
+# Logging
+: ${LOG_FILE:=/var/log/keystone/keystone.log}
+: ${VERBOSE_LOGGING:=true}
+: ${DEBUG_LOGGING:=false}
+: ${USE_STDERR:=false}
+# Token provider, driver, etc..
+: ${TOKEN_PROVIDER:=uuid}
+: ${TOKEN_DRIVER:=sql}
+
+## Check DB connectivity and required variables
+echo "Checking connectivity to the DB"
+fail_unless_db
+echo "Checking for required variables"
+check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_DB_PASSWORD \
+ KEYSTONE_ADMIN_PASSWORD ADMIN_TENANT_NAME \
+ KEYSTONE_PUBLIC_SERVICE_HOST KEYSTONE_ADMIN_SERVICE_HOST \
+ PUBLIC_IP
+dump_vars
+
+# Setup the Keystone DB
+echo "Setting up Keystone DB"
+mysql -h ${MARIADB_SERVICE_HOST} -u root -p"${DB_ROOT_PASSWORD}" mysql <<EOF
+CREATE DATABASE IF NOT EXISTS ${KEYSTONE_DB_NAME};
+GRANT ALL PRIVILEGES ON ${KEYSTONE_DB_NAME}.* TO
+ '${KEYSTONE_DB_USER}'@'%' IDENTIFIED BY '${KEYSTONE_DB_PASSWORD}'
+EOF
+
+# File path and name used by crudini tool
+cfg=/etc/keystone/keystone.conf
+
+# Token Configuration
+echo "Configuring keystone.conf"
+crudini --set $cfg \
+ DEFAULT \
+ admin_token \
+ "${KEYSTONE_ADMIN_TOKEN}"
+
+# Database Configuration
+crudini --set $cfg \
+ database \
+ connection \
+ "mysql://${KEYSTONE_DB_USER}:${KEYSTONE_DB_PASSWORD}@${MARIADB_SERVICE_HOST}/${KEYSTONE_DB_NAME}"
+
+# Logging
+crudini --del $cfg \
+ DEFAULT \
+ log_dir
+crudini --set $cfg \
+ DEFAULT \
+ log_file \
+ ${LOG_FILE}
+crudini --set $cfg \
+ DEFAULT \
+ verbose \
+ ${VERBOSE_LOGGING}
+crudini --set $cfg \
+ DEFAULT \
+ debug \
+ ${DEBUG_LOGGING}
+crudini --set $cfg \
+ DEFAULT \
+ use_stderr \
+ ${USE_STDERR}
+
+# Token Management
+crudini --set $cfg \
+ token \
+ provider \
+ keystone.token.providers."${TOKEN_PROVIDER}".Provider
+crudini --set $cfg \
+ token \
+ driver \
+ keystone.token.persistence.backends."${TOKEN_DRIVER}".Token
+crudini --set $cfg \
+ revoke \
+ driver \
+ keystone.contrib.revoke.backends."${TOKEN_DRIVER}".Revoke
+
+# Setup the openrc auth file
+cat > /openrc <<EOF
+export OS_AUTH_URL=http://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v${KEYSTONE_API_VERSION}
+export OS_USERNAME=${KEYSTONE_USER}
+export OS_PASSWORD=${KEYSTONE_ADMIN_PASSWORD}
+export OS_TENANT_NAME=${ADMIN_TENANT_NAME}
+EOF
+
+# Run PKI Setup script
+echo "Setting up PKI"
+/usr/bin/keystone-manage pki_setup --keystone-user keystone --keystone-group keystone
+
+# Fix permissions
+chown -R keystone:keystone /var/log/keystone
+chown -R keystone:keystone /etc/keystone/ssl
+chmod -R o-rwx /etc/keystone/ssl
+
+# Initialize the Keystone DB
+echo "Initializing Keystone DB"
+if [ "${INIT_DB}" == "true" ] ; then
+ su -s /bin/bash -c "keystone-manage db_sync" keystone
+fi
+
+# Start Keystone
+echo "Starting Keystone"
+/usr/bin/keystone-all &
+PID=$!
+
+# Export Keystone service environment variables
+export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
+export SERVICE_ENDPOINT="http://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v${KEYSTONE_API_VERSION}"
+
+# Check to make sure the service is running
+echo "Verifying Keystone is running"
+while ! curl -o /dev/null -s --fail ${SERVICE_ENDPOINT}; do
+ echo "waiting for Keystone @ ${SERVICE_ENDPOINT}"
+ sleep 1;
+done
+echo "keystone is active @ ${SERVICE_ENDPOINT}"
+
+# Create Keystone tenant, user, role, service and endpoints
+echo "Creating Keystone tenant, user, role, service and endpoints"
+crux user-create --update \
+ -n ${ADMIN_USER} -p "${ADMIN_USER_PASSWORD}" \
+ -t ${ADMIN_TENANT_NAME} -r admin
+crux user-create --update \
+ -n ${KEYSTONE_USER} -p "${KEYSTONE_ADMIN_PASSWORD}" \
+ -t ${ADMIN_TENANT_NAME} -r admin
+crux endpoint-create --remove-all \
+ -n keystone -t identity \
+ -I "http://${KEYSTONE_PUBLIC_SERVICE_HOST}:${KEYSTONE_PUBLIC_SERVICE_PORT}/v${KEYSTONE_API_VERSION}" \
+ -A "http://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v${KEYSTONE_API_VERSION}" \
+ -P "http://${KEYSTONE_PUBLIC_SERVICE_HOST}:${KEYSTONE_PUBLIC_SERVICE_PORT}/v${KEYSTONE_API_VERSION}"
+
+# Wait on all jobs to exit before proceeding (see man wait)
+wait
diff --git a/docker/common/magnum/magnum-api/check.sh b/docker/common/magnum/magnum-api/check.sh
new file mode 100755
index 000000000..ee03dc6d2
--- /dev/null
+++ b/docker/common/magnum/magnum-api/check.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+RES=0
+
+. /openrc
+if ! keystone token-get > /dev/null; then
+ echo "ERROR: keystone token-get failed" >&2
+ RES=1
+else
+ if ! heat stack-list > /dev/null; then
+ echo "ERROR: heat stack-list failed" >&2
+ RES=1
+ fi
+fi
+
+exit $RES
diff --git a/docker/common/magnum/magnum-api/start.sh b/docker/common/magnum/magnum-api/start.sh
new file mode 100755
index 000000000..00a51b3cd
--- /dev/null
+++ b/docker/common/magnum/magnum-api/start.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+set -e
+
+. /opt/kolla/kolla-common.sh
+. /opt/kolla/config-magnum.sh
+
+check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
+ MAGNUM_KEYSTONE_USER MAGNUM_KEYSTONE_PASSWORD \
+ KEYSTONE_AUTH_PROTOCOL ADMIN_TENANT_NAME \
+ MAGNUM_API_SERVICE_HOST KEYSTONE_ADMIN_SERVICE_PORT \
+ MAGNUM_API_SERVICE_PORT
+
+fail_unless_os_service_running keystone
+
+export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
+export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v2.0"
+crux user-create -n ${MAGNUM_KEYSTONE_USER} \
+ -p ${MAGNUM_KEYSTONE_PASSWORD} \
+ -t ${ADMIN_TENANT_NAME} \
+ -r admin
+
+crux endpoint-create --remove-all -n ${MAGNUM_KEYSTONE_USER} -t container \
+ -I "${KEYSTONE_AUTH_PROTOCOL}://${MAGNUM_API_SERVICE_HOST}:${MAGNUM_API_SERVICE_PORT}/v1" \
+ -P "${KEYSTONE_AUTH_PROTOCOL}://${MAGNUM_API_SERVICE_HOST}:${MAGNUM_API_SERVICE_PORT}/v1" \
+ -A "${KEYSTONE_AUTH_PROTOCOL}://${MAGNUM_API_SERVICE_HOST}:${MAGNUM_API_SERVICE_PORT}/v1"
+
+exec /usr/bin/magnum-api
diff --git a/docker/common/magnum/magnum-base/config-magnum.sh b/docker/common/magnum/magnum-base/config-magnum.sh
new file mode 100755
index 000000000..03599d359
--- /dev/null
+++ b/docker/common/magnum/magnum-base/config-magnum.sh
@@ -0,0 +1,46 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/kolla-common.sh
+
+check_required_vars MAGNUM_DB_PASSWORD MAGNUM_KEYSTONE_PASSWORD \
+ KEYSTONE_PUBLIC_SERVICE_HOST KEYSTONE_PUBLIC_SERVICE_PORT \
+ MAGNUM_KEYSTONE_USER ADMIN_TENANT_NAME \
+ MAGNUM_DB_USER MAGNUM_DB_NAME KEYSTONE_AUTH_PROTOCOL \
+ KEYSTONE_PUBLIC_SERVICE_PORT RABBITMQ_SERVICE_HOST \
+ VERBOSE_LOGGING DEBUG_LOGGING
+
+fail_unless_db
+dump_vars
+
+cat > /openrc <<EOF
+export OS_AUTH_URL="http://${KEYSTONE_PUBLIC_SERVICE_HOST}:${KEYSTONE_PUBLIC_SERVICE_PORT}/v2.0"
+export OS_USERNAME="${MAGNUM_KEYSTONE_USER}"
+export OS_PASSWORD="${MAGNUM_KEYSTONE_PASSWORD}"
+export OS_TENANT_NAME="${ADMIN_TENANT_NAME}"
+EOF
+
+cfg=/etc/magnum/magnum.conf
+
+crudini --set $cfg DEFAULT log_file ""
+crudini --set $cfg DEFAULT verbose "${VERBOSE_LOGGING}"
+crudini --set $cfg DEFAULT debug "${DEBUG_LOGGING}"
+crudini --set $cfg DEFAULT use_stderr true
+crudini --set $cfg DEFAULT rpc_backend magnum.openstack.common.rpc.impl_kombu
+crudini --set $cfg DEFAULT admin_user admin
+crudini --set $cfg oslo_messaging_rabbit rabbit_host ${RABBITMQ_SERVICE_HOST}
+crudini --set $cfg oslo_messaging_rabbit rabbit_userid ${RABBIT_USER}
+crudini --set $cfg oslo_messaging_rabbit rabbit_password ${RABBIT_PASSWORD}
+crudini --set $cfg database connection \
+ mysql://${MAGNUM_DB_USER}:${MAGNUM_DB_PASSWORD}@${MARIADB_SERVICE_HOST}/${MAGNUM_DB_NAME}
+crudini --set $cfg keystone_authtoken auth_protocol "${KEYSTONE_AUTH_PROTOCOL}"
+crudini --set $cfg keystone_authtoken auth_host "${KEYSTONE_PUBLIC_SERVICE_HOST}"
+crudini --set $cfg keystone_authtoken auth_port "${KEYSTONE_PUBLIC_SERVICE_PORT}"
+crudini --set $cfg keystone_authtoken auth_uri \
+ "${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_PUBLIC_SERVICE_HOST}:${KEYSTONE_PUBLIC_SERVICE_PORT}/v2.0"
+crudini --set $cfg keystone_authtoken admin_tenant_name "${ADMIN_TENANT_NAME}"
+crudini --set $cfg keystone_authtoken admin_user "${MAGNUM_KEYSTONE_USER}"
+crudini --set $cfg keystone_authtoken admin_password \
+ "${MAGNUM_KEYSTONE_PASSWORD}"
+crudini --set $cfg api host ${MAGNUM_API_SERVICE_HOST}
diff --git a/docker/common/magnum/magnum-conductor/start.sh b/docker/common/magnum/magnum-conductor/start.sh
new file mode 100755
index 000000000..4cf1291a3
--- /dev/null
+++ b/docker/common/magnum/magnum-conductor/start.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+. /opt/kolla/kolla-common.sh
+. /opt/kolla/config-magnum.sh
+
+check_required_vars MAGNUM_DB_NAME MAGNUM_DB_USER MAGNUM_DB_PASSWORD
+fail_unless_db
+
+mysql -h ${MARIADB_SERVICE_HOST} -u root -p${DB_ROOT_PASSWORD} mysql <<EOF
+CREATE DATABASE IF NOT EXISTS ${MAGNUM_DB_NAME} DEFAULT CHARACTER SET utf8;
+GRANT ALL PRIVILEGES ON ${MAGNUM_DB_NAME}.* TO
+ '${MAGNUM_DB_USER}'@'%' IDENTIFIED BY '${MAGNUM_DB_PASSWORD}'
+EOF
+
+/usr/bin/magnum-db-manage upgrade
+
+exec /usr/bin/magnum-conductor
diff --git a/docker/common/mariadb-app/config-mysql.sh b/docker/common/mariadb-app/config-mysql.sh
new file mode 100755
index 000000000..b11939b8b
--- /dev/null
+++ b/docker/common/mariadb-app/config-mysql.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+. /opt/kolla/kolla-common.sh
+
+: ${BIND_ADDRESS:=$PUBLIC_IP}
+: ${DB_ROOT_PASSWORD:=$DB_ROOT_PASSWORD}
+: ${DEFAULT_STORAGE_ENGINE:=innodb}
+: ${COLLATION_SERVER:=utf8_general_ci}
+: ${INIT_CONNECT:=SET NAMES utf8}
+: ${CHAR_SET_SERVER:=utf8}
+: ${INNODB_FILE_PER_TABLE:=true}
+: ${DATADIR:=/var/lib/mysql}
+: ${TEMP_FILE:='/tmp/mysql-first-time.sql'}
+
+server_cnf=/etc/my.cnf.d/server.cnf
+
+crudini --set $server_cnf mysqld bind-address $BIND_ADDRESS
+crudini --set $server_cnf mysqld default-storage-engine $DEFAULT_STORAGE_ENGINE
+crudini --set $server_cnf mysqld collation-server $COLLATION_SERVER
+crudini --set $server_cnf mysqld init-connect "'${INIT_CONNECT}'"
+crudini --set $server_cnf mysqld character-set-server $CHAR_SET_SERVER
+if [ "${INNODB_FILE_PER_TABLE}" == "true" ] || ["${INNODB_FILE_PER_TABLE}" == "True" ] ; then
+ crudini --set $server_cnf mysqld innodb_file_per_table 1
+fi
diff --git a/docker/centos/binary/mariadb-app/mysql-entrypoint.sh b/docker/common/mariadb-app/mysql-entrypoint.sh
index 6dece43ca..aa04a84b0 100755
--- a/docker/centos/binary/mariadb-app/mysql-entrypoint.sh
+++ b/docker/common/mariadb-app/mysql-entrypoint.sh
@@ -32,7 +32,7 @@ EOSQL
fi
if [ "$MARIADB_USER" -a "$MARIADB_PASSWORD" ]; then
- echo "CREATE USER '$MARIADB_USER'@'%' IDENTIFIED BY '$MARIADB_PASSWORD' ;" >> "$TEMP_FILE"
+ echo "CREATE USER '$MARIADB_USER'@'%' IDENTIFIED BY '$MARIADB_PASSWORD' ;" >> "$TEMP_FILE"
if [ "$MARIADB_DATABASE" ]; then
echo "GRANT ALL ON $MARIADB_DATABASE.* TO '$MARIADB_USER'@'%' ;" >> "$TEMP_FILE"
diff --git a/docker/common/neutron/neutron-agents/check-scripts/check-dhcp-agent.sh b/docker/common/neutron/neutron-agents/check-scripts/check-dhcp-agent.sh
new file mode 100755
index 000000000..7dda736ef
--- /dev/null
+++ b/docker/common/neutron/neutron-agents/check-scripts/check-dhcp-agent.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+RES=0
+
+check=$(/usr/bin/neutron agent-list | awk '/ DHCP / {print $9}')
+error="ERROR: Neutron DHCP Agent is not alive."
+
+if [[ $check != ":-)" ]]; then
+ echo $error >&2
+ RES=1
+fi
+
+exit $RES
diff --git a/docker/common/neutron/neutron-agents/check-scripts/check-l3-agent.sh b/docker/common/neutron/neutron-agents/check-scripts/check-l3-agent.sh
new file mode 100755
index 000000000..d32c1e272
--- /dev/null
+++ b/docker/common/neutron/neutron-agents/check-scripts/check-l3-agent.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+RES=0
+
+check=$(/usr/bin/neutron agent-list | awk '/ L3 / {print $9}')
+error="ERROR: Neutron L3 Agent is not alive."
+
+if [[ $check != ":-)" ]]; then
+ echo $error >&2
+ RES=1
+fi
+
+exit $RES
diff --git a/docker/common/neutron/neutron-agents/check-scripts/check-linuxbridge-agent.sh b/docker/common/neutron/neutron-agents/check-scripts/check-linuxbridge-agent.sh
new file mode 100755
index 000000000..4485fc1ec
--- /dev/null
+++ b/docker/common/neutron/neutron-agents/check-scripts/check-linuxbridge-agent.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+RES=0
+
+check=$(/usr/bin/neutron agent-list | awk '/ Linux / {print $10}')
+error="ERROR: Neutron Linux Bridge agent is not alive."
+
+if [[ $check != ":-)" ]]; then
+ echo $error >&2
+ RES=1
+fi
+
+exit $RES
diff --git a/docker/common/neutron/neutron-agents/check-scripts/check-metadata-agent.sh b/docker/common/neutron/neutron-agents/check-scripts/check-metadata-agent.sh
new file mode 100755
index 000000000..fd1c6812b
--- /dev/null
+++ b/docker/common/neutron/neutron-agents/check-scripts/check-metadata-agent.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+RES=0
+
+check=$(/usr/bin/neutron agent-list | awk '/ Metadata / {print $9}')
+error="ERROR: Neutron Metadata Agent is not alive."
+
+if [[ $check != ":-)" ]]; then
+ echo $error >&2
+ RES=1
+fi
+
+exit $RES
diff --git a/docker/common/neutron/neutron-agents/config-scripts/config-dhcp-agent.sh b/docker/common/neutron/neutron-agents/config-scripts/config-dhcp-agent.sh
new file mode 100755
index 000000000..db71678b1
--- /dev/null
+++ b/docker/common/neutron/neutron-agents/config-scripts/config-dhcp-agent.sh
@@ -0,0 +1,88 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/config-neutron.sh
+. /opt/kolla/config-sudoers.sh
+
+: ${DHCP_DRIVER:=neutron.agent.linux.dhcp.Dnsmasq}
+: ${USE_NAMESPACES:=true}
+: ${DELETE_NAMESPACES:=true}
+: ${DNSMASQ_CONFIG_FILE:=/etc/neutron/dnsmasq/dnsmasq-neutron.conf}
+: ${ROOT_HELPER:=sudo neutron-rootwrap /etc/neutron/rootwrap.conf}
+
+mkdir -p $(dirname $DNSMASQ_CONFIG_FILE)
+
+check_required_vars VERBOSE_LOGGING DEBUG_LOGGING MECHANISM_DRIVERS \
+ DHCP_DRIVER USE_NAMESPACES DELETE_NAMESPACES \
+ NEUTRON_LOG_DIR DNSMASQ_CONFIG_FILE \
+
+cfg=/etc/neutron/dhcp_agent.ini
+neutron_conf=/etc/neutron/neutron.conf
+
+# Workaround bug in dhclient in cirros images which does not correctly
+# handle setting checksums of packets when using hardware with checksum
+# offloading. See:
+# https://www.rdoproject.org/forum/discussion/567/packstack-allinone-grizzly-cirros-image-cannot-get-a-dhcp-address-when-a-centos-image-can/p1
+
+/usr/sbin/iptables -A POSTROUTING -t mangle -p udp --dport bootpc \
+ -j CHECKSUM --checksum-fill
+
+if [[ ${MECHANISM_DRIVERS} =~ linuxbridge ]]; then
+ interface_driver="neutron.agent.linux.interface.BridgeInterfaceDriver"
+elif [[ ${MECHANISM_DRIVERS} == "openvswitch" ]]; then
+ interface_driver="neutron.agent.linux.interface.OVSInterfaceDriver"
+fi
+
+# Logging
+crudini --set $neutron_conf \
+ DEFAULT \
+ log_file \
+ "${NEUTRON_DHCP_AGENT_LOG_FILE}"
+
+# Configure dhcp_agent.ini
+crudini --set $cfg \
+ DEFAULT \
+ verbose \
+ "${VERBOSE_LOGGING}"
+crudini --set $cfg \
+ DEFAULT \
+ debug \
+ "${DEBUG_LOGGING}"
+crudini --set $cfg \
+ DEFAULT \
+ interface_driver \
+ "$interface_driver"
+crudini --set $cfg \
+ DEFAULT \
+ dhcp_driver \
+ "${DHCP_DRIVER}"
+crudini --set $cfg \
+ DEFAULT \
+ use_namespaces \
+ "${USE_NAMESPACES}"
+crudini --set $cfg \
+ DEFAULT \
+ delete_namespaces \
+ "${DELETE_NAMESPACES}"
+crudini --set $cfg \
+ DEFAULT \
+ dnsmasq_config_file \
+ "${DNSMASQ_CONFIG_FILE}"
+crudini --set $cfg \
+ DEFAULT \
+ root_helper \
+ "${ROOT_HELPER}"
+
+cat > ${DNSMASQ_CONFIG_FILE} <<EOF
+dhcp-option-force=26,1450
+log-facility=${NEUTRON_LOG_DIR}/neutron-dnsmasq.log
+EOF
+
+# Remove any existing qdhcp namespaces
+ip netns list | grep qdhcp | while read -r line ; do
+ ip netns delete $line
+done
+
+# Start DHCP Agent
+exec /usr/bin/neutron-dhcp-agent --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/dhcp_agent.ini --config-dir /etc/neutron
diff --git a/docker/common/neutron/neutron-agents/config-scripts/config-l3-agent.sh b/docker/common/neutron/neutron-agents/config-scripts/config-l3-agent.sh
new file mode 100755
index 000000000..761d07685
--- /dev/null
+++ b/docker/common/neutron/neutron-agents/config-scripts/config-l3-agent.sh
@@ -0,0 +1,85 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/config-neutron.sh
+. /opt/kolla/config-sudoers.sh
+
+: ${USE_NAMESPACES:=true}
+
+check_required_vars VERBOSE_LOGGING DEBUG_LOGGING
+
+cfg=/etc/neutron/l3_agent.ini
+neutron_conf=/etc/neutron/neutron.conf
+
+# Logging
+crudini --set $neutron_conf \
+ DEFAULT \
+ log_file \
+ "${NEUTRON_L3_AGENT_LOG_FILE}"
+
+# Configure l3_agent.ini
+crudini --set $cfg \
+ DEFAULT \
+ verbose \
+ "${VERBOSE_LOGGING}"
+crudini --set $cfg \
+ DEFAULT \
+ debug \
+ "${DEBUG_LOGGING}"
+if [[ "${MECHANISM_DRIVERS}" =~ linuxbridge ]] ; then
+ crudini --set $cfg \
+ DEFAULT \
+ interface_driver \
+ "neutron.agent.linux.interface.BridgeInterfaceDriver"
+ crudini --set $cfg \
+ DEFAULT \
+ gateway_external_network_id \
+ ""
+ crudini --set $cfg \
+ DEFAULT \
+ external_network_bridge \
+ ""
+elif [[ "${MECHANISM_DRIVERS}" =~ .*openvswitch* ]] ; then
+ crudini --set $cfg \
+ DEFAULT \
+ interface_driver \
+ "neutron.agent.linux.interface.OVSInterfaceDriver"
+ crudini --set $cfg \
+ DEFAULT \
+ gateway_external_network_id \
+ "${NEUTRON_FLAT_NETWORK_BRIDGE}"
+ crudini --set $cfg \
+ DEFAULT \
+ external_network_bridge \
+ "${NEUTRON_FLAT_NETWORK_BRIDGE}"
+fi
+
+crudini --set $cfg \
+ DEFAULT \
+ use_namespaces \
+ "${USE_NAMESPACES}"
+
+if [ "${USE_NAMESPACES}" == "false" ] ; then
+ source /openrc
+ # Create router if it does not exist
+ /usr/bin/neutron router-list | grep admin-router || /usr/bin/neutron router-create admin-router
+ # Set router-id
+ crudini --set $cfg \
+ DEFAULT \
+ router_id \
+ "$(/usr/bin/neutron router-list | awk '/ admin-router / {print $2}')"
+elif [ "${USE_NAMESPACES}" == "true" ] ; then
+ crudini --set $cfg \
+ DEFAULT \
+ router_delete_namespaces \
+ "true"
+fi
+
+# Remove any existing qrouter namespaces
+ip netns list | grep qrouter | while read -r line ; do
+ ip netns delete $line
+done
+
+# Start L3 Agent
+exec /usr/bin/neutron-l3-agent --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/l3_agent.ini --config-file /etc/neutron/fwaas_driver.ini --config-dir /etc/neutron
diff --git a/docker/common/neutron/neutron-agents/config-scripts/config-linuxbridge-agent.sh b/docker/common/neutron/neutron-agents/config-scripts/config-linuxbridge-agent.sh
new file mode 100755
index 000000000..bd8f90194
--- /dev/null
+++ b/docker/common/neutron/neutron-agents/config-scripts/config-linuxbridge-agent.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/config-neutron.sh
+. /opt/kolla/config-sudoers.sh
+
+: ${NEUTRON_FLAT_NETWORK_NAME:=physnet1}
+: ${NEUTRON_FLAT_NETWORK_INTERFACE:=eth1}
+
+check_required_vars PUBLIC_IP NEUTRON_FLAT_NETWORK_NAME \
+ NEUTRON_FLAT_NETWORK_INTERFACE
+
+cfg=/etc/neutron/plugins/ml2/ml2_conf.ini
+
+# Configure ml2_conf.ini
+if [[ ${TYPE_DRIVERS} =~ vxlan ]]; then
+ crudini --set $cfg \
+ vxlan \
+ local_ip \
+ "${PUBLIC_IP}"
+fi
+
+crudini --set $cfg \
+ linux_bridge \
+ physical_interface_mappings \
+ "${NEUTRON_FLAT_NETWORK_NAME}:${NEUTRON_FLAT_NETWORK_INTERFACE}"
+
+exec /usr/bin/neutron-linuxbridge-agent --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini --config-dir /etc/neutron
diff --git a/docker/common/neutron/neutron-agents/config-scripts/config-metadata-agent.sh b/docker/common/neutron/neutron-agents/config-scripts/config-metadata-agent.sh
new file mode 100755
index 000000000..d1eef341c
--- /dev/null
+++ b/docker/common/neutron/neutron-agents/config-scripts/config-metadata-agent.sh
@@ -0,0 +1,74 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/config-neutron.sh
+. /opt/kolla/config-sudoers.sh
+
+: ${KEYSTONE_REGION:=RegionOne}
+: ${ENDPOINT_TYPE:=adminURL}
+: ${NEUTRON_SHARED_SECRET:=sharedsecret}
+
+check_required_vars VERBOSE_LOGGING DEBUG_LOGGING KEYSTONE_AUTH_PROTOCOL \
+ KEYSTONE_PUBLIC_SERVICE_HOST ADMIN_TENANT_NAME \
+ NEUTRON_KEYSTONE_USER NEUTRON_KEYSTONE_PASSWORD \
+ NEUTRON_SHARED_SECRET NOVA_METADATA_API_SERVICE_HOST \
+ NOVA_METADATA_API_SERVICE_PORT
+
+cfg=/etc/neutron/metadata_agent.ini
+neutron_conf=/etc/neutron/neutron.conf
+
+# Logging
+crudini --set $neutron_conf \
+ DEFAULT \
+ log_file \
+ "${NEUTRON_METADATA_AGENT_LOG_FILE}"
+
+# Configure metadata_agent.ini
+crudini --set $cfg \
+ DEFAULT \
+ verbose \
+ "${VERBOSE_LOGGING}"
+crudini --set $cfg \
+ DEFAULT \
+ debug \
+ "${DEBUG_LOGGING}"
+crudini --set $cfg \
+ DEFAULT \
+ auth_region \
+ "${KEYSTONE_REGION}"
+crudini --set $cfg \
+ DEFAULT \
+ endpoint_type \
+ "${ENDPOINT_TYPE}"
+crudini --set $cfg \
+ DEFAULT \
+ auth_url \
+ "${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_PUBLIC_SERVICE_HOST}:${KEYSTONE_PUBLIC_SERVICE_PORT}/v2.0"
+crudini --set $cfg \
+ DEFAULT \
+ admin_tenant_name \
+ "${ADMIN_TENANT_NAME}"
+crudini --set $cfg \
+ DEFAULT \
+ admin_user \
+ "${NEUTRON_KEYSTONE_USER}"
+crudini --set $cfg \
+ DEFAULT \
+ admin_password \
+ "${NEUTRON_KEYSTONE_PASSWORD}"
+crudini --set $cfg \
+ DEFAULT \
+ nova_metadata_ip \
+ "${NOVA_METADATA_API_SERVICE_HOST}"
+crudini --set $cfg \
+ DEFAULT \
+ nova_metadata_port \
+ "${NOVA_METADATA_API_SERVICE_PORT}"
+crudini --set $cfg \
+ DEFAULT \
+ metadata_proxy_shared_secret \
+ "${NEUTRON_SHARED_SECRET}"
+
+# Start Metadata Agent
+exec /usr/bin/neutron-metadata-agent --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/metadata_agent.ini --config-dir /etc/neutron
diff --git a/docker/common/neutron/neutron-agents/config-scripts/config-sudoers.sh b/docker/common/neutron/neutron-agents/config-scripts/config-sudoers.sh
new file mode 100755
index 000000000..0e02226db
--- /dev/null
+++ b/docker/common/neutron/neutron-agents/config-scripts/config-sudoers.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+# Neutron uses rootwrap which requires a tty for sudo.
+# Since the container is running in daemon mode, a tty
+# is not present and requiretty must be commented out.
+if [ ! -f /var/run/sudo-modified ]; then
+ chmod 0640 /etc/sudoers
+ sed -i '/Defaults requiretty/s/^/#/' /etc/sudoers
+ chmod 0440 /etc/sudoers
+fi
+
+touch /var/run/sudo-modified
diff --git a/docker/common/neutron/neutron-agents/fwaas_driver.ini b/docker/common/neutron/neutron-agents/fwaas_driver.ini
new file mode 100644
index 000000000..41f761abf
--- /dev/null
+++ b/docker/common/neutron/neutron-agents/fwaas_driver.ini
@@ -0,0 +1,3 @@
+[fwaas]
+#driver = neutron.services.firewall.drivers.linux.iptables_fwaas.IptablesFwaasDriver
+#enabled = True
diff --git a/docker/common/neutron/neutron-agents/supervisord.conf b/docker/common/neutron/neutron-agents/supervisord.conf
new file mode 100644
index 000000000..7455cb3d7
--- /dev/null
+++ b/docker/common/neutron/neutron-agents/supervisord.conf
@@ -0,0 +1,53 @@
+[unix_http_server]
+file = /var/run/supervisor.sock
+
+[inet_http_server]
+port = 127.0.0.1:9001
+
+[supervisord]
+nodaemon=true
+logfile = /var/log/supervisor/supervisord.log
+logfile_maxbytes = 200KB
+logfile_backups = 1
+pidfile = /var/run/supervisord.pid
+childlogdir = /var/log/supervisor
+
+[rpcinterface:supervisor]
+supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
+
+[supervisorctl]
+serverurl = unix:///var/run/supervisor.sock
+
+[program:neutron-linuxbridge-agent]
+command=/opt/kolla/neutron/config-linuxbridge-agent.sh
+priority=30
+startsec=10
+stderr_events_enabled=true
+stdout_events_enabled=true
+
+[program:neutron-dhcp-agent]
+command=/opt/kolla/neutron/config-dhcp-agent.sh
+priority=40
+startsec=10
+stderr_events_enabled=true
+stdout_events_enabled=true
+
+[program:neutron-metadata-agent]
+command=/opt/kolla/neutron/config-metadata-agent.sh
+priority=40
+startsec=10
+stderr_events_enabled=true
+stdout_events_enabled=true
+
+[program:neutron-l3-agent]
+command=/opt/kolla/neutron/config-l3-agent.sh
+priority=40
+startsec=10
+stderr_events_enabled=true
+stdout_events_enabled=true
+
+[eventlistener:stdout]
+command = supervisor_stdout
+buffer_size = 100
+events = PROCESS_LOG
+result_handler = supervisor_stdout:event_handler
diff --git a/docker/common/neutron/neutron-base/config-neutron.sh b/docker/common/neutron/neutron-base/config-neutron.sh
new file mode 100644
index 000000000..015565105
--- /dev/null
+++ b/docker/common/neutron/neutron-base/config-neutron.sh
@@ -0,0 +1,210 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/kolla-common.sh
+
+# Database
+: ${NEUTRON_DB_NAME:=neutron}
+: ${NEUTRON_DB_USER:=neutron}
+: ${NEUTRON_DB_PASSWORD:=password}
+# Keystone
+: ${ADMIN_TENANT_NAME:=admin}
+: ${NEUTRON_KEYSTONE_USER:=neutron}
+: ${NEUTRON_KEYSTONE_PASSWORD:=password}
+: ${KEYSTONE_AUTH_PROTOCOL:=http}
+: ${KEYSTONE_ADMIN_SERVICE_HOST:=127.0.0.1}
+: ${KEYSTONE_PUBLIC_SERVICE_HOST:=127.0.0.1}
+: ${KEYSTONE_ADMIN_SERVICE_PORT:=35357}
+: ${KEYSTONE_PUBLIC_SERVICE_PORT:=5000}
+: ${KEYSTONE_REGION:=RegionOne}
+# RabbitMQ
+: ${RABBIT_HOST:=$RABBITMQ_SERVICE_HOST}
+: ${RABBIT_USER:=guest}
+: ${RABBIT_PASSWORD:=guest}
+# Logging
+: ${VERBOSE_LOGGING:=true}
+: ${DEBUG_LOGGING:=false}
+# Networking
+: ${NEUTRON_FLAT_NETWORK_NAME:=physnet1}
+# Paste configuration file
+: ${API_PASTE_CONFIG:=/usr/share/neutron/api-paste.ini}
+
+check_required_vars NEUTRON_KEYSTONE_PASSWORD NEUTRON_API_PASTE_CONFIG \
+ KEYSTONE_PUBLIC_SERVICE_HOST RABBITMQ_SERVICE_HOST
+
+core_cfg=/etc/neutron/neutron.conf
+ml2_cfg=/etc/neutron/plugins/ml2/ml2_conf.ini
+
+# Logging
+crudini --set $core_cfg \
+ DEFAULT \
+ log_dir \
+ "${NEUTRON_LOG_DIR}"
+crudini --set $core_cfg \
+ DEFAULT \
+ verbose \
+ "${VERBOSE_LOGGING}"
+crudini --set $core_cfg \
+ DEFAULT \
+ debug \
+ "${DEBUG_LOGGING}"
+
+# Paste config
+crudini --set $core_cfg \
+ DEFAULT \
+ api_paste_config \
+ "${NEUTRON_API_PASTE_CONFIG}"
+
+# Rabbit
+crudini --set $core_cfg \
+ DEFAULT \
+ rabbit_host \
+ "${RABBIT_HOST}"
+crudini --set $core_cfg \
+ DEFAULT \
+ rabbit_userid \
+ "${RABBIT_USER}"
+crudini --set $core_cfg \
+ DEFAULT \
+ rabbit_password \
+ "${RABBIT_PASSWORD}"
+
+# Locking
+crudini --set $core_cfg \
+ DEFAULT \
+ lock_path \
+ "/var/lock/neutron"
+
+# Keystone
+crudini --set $core_cfg \
+ DEFAULT \
+ auth_strategy \
+ "keystone"
+crudini --set $core_cfg \
+ keystone_authtoken \
+ auth_uri \
+ "${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_PUBLIC_SERVICE_HOST}:${KEYSTONE_PUBLIC_SERVICE_PORT}/v2.0"
+crudini --set $core_cfg \
+ keystone_authtoken \
+ identity_uri \
+ "${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}"
+crudini --set $core_cfg \
+ keystone_authtoken \
+ admin_tenant_name \
+ "${ADMIN_TENANT_NAME}"
+crudini --set $core_cfg \
+ keystone_authtoken \
+ admin_user \
+ "${NEUTRON_KEYSTONE_USER}"
+crudini --set $core_cfg \
+ keystone_authtoken \
+ admin_password \
+ "${NEUTRON_KEYSTONE_PASSWORD}"
+
+# Rootwrap
+crudini --set $core_cfg \
+ agent \
+ root_helper \
+ "sudo neutron-rootwrap /etc/neutron/rootwrap.conf"
+
+# neutron.conf ml2 configuration
+crudini --set $core_cfg \
+ DEFAULT \
+ core_plugin \
+ "neutron.plugins.ml2.plugin.Ml2Plugin"
+crudini --set $core_cfg \
+ DEFAULT \
+ service_plugins \
+ "neutron.services.l3_router.l3_router_plugin.L3RouterPlugin"
+crudini --set $core_cfg \
+ DEFAULT \
+ allow_overlapping_ips \
+ "True"
+
+# Configure ml2_conf.ini
+crudini --set $ml2_cfg \
+ ml2 \
+ type_drivers \
+ "${TYPE_DRIVERS}"
+crudini --set $ml2_cfg \
+ ml2 \
+ tenant_network_types \
+ "${TENANT_NETWORK_TYPES}"
+crudini --set $ml2_cfg \
+ ml2 \
+ mechanism_drivers \
+ "${MECHANISM_DRIVERS}"
+
+if [[ ${TYPE_DRIVERS} =~ .*flat.* ]]; then
+ crudini --set $ml2_cfg \
+ ml2_type_flat \
+ flat_networks \
+ ${NEUTRON_FLAT_NETWORK_NAME}
+fi
+
+if [[ ${TYPE_DRIVERS} =~ .*vxlan.* ]]; then
+ crudini --set $ml2_cfg \
+ ml2_type_vxlan \
+ vxlan_group \
+ ""
+ crudini --set $ml2_cfg \
+ ml2_type_vxlan \
+ vni_ranges \
+ "1:1000"
+ crudini --set $ml2_cfg \
+ vxlan \
+ enable_vxlan \
+ "True"
+ crudini --set $ml2_cfg \
+ vxlan \
+ vxlan_group \
+ ""
+ crudini --set $ml2_cfg \
+ vxlan \
+ l2_population \
+ "True"
+ crudini --set $ml2_cfg \
+ agent \
+ tunnel_types \
+ "vxlan"
+ crudini --set $ml2_cfg \
+ agent \
+ vxlan_udp_port \
+ "4789"
+ crudini --set $core_cfg \
+ DEFAULT \
+ network_device_mtu \
+ "1450"
+fi
+
+crudini --set $ml2_cfg \
+ l2pop \
+ agent_boot_time \
+ "180"
+crudini --set $ml2_cfg \
+ securitygroup \
+ enable_security_group \
+ "True"
+crudini --set $ml2_cfg \
+ securitygroup \
+ enable_ipset \
+ "True"
+
+if [[ ${MECHANISM_DRIVERS} =~ linuxbridge ]]; then
+ firewall_driver="neutron.agent.linux.iptables_firewall.IptablesFirewallDriver"
+elif [[ ${MECHANISM_DRIVERS} == "openvswitch" ]]; then
+ firewall_driver="neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver"
+fi
+
+crudini --set $ml2_cfg \
+ securitygroup \
+ firewall_driver \
+ "$firewall_driver"
+
+cat > /openrc <<EOF
+export OS_AUTH_URL="http://${KEYSTONE_PUBLIC_SERVICE_HOST}:${KEYSTONE_PUBLIC_SERVICE_PORT}/v2.0"
+export OS_USERNAME="${NEUTRON_KEYSTONE_USER}"
+export OS_PASSWORD="${NEUTRON_KEYSTONE_PASSWORD}"
+export OS_TENANT_NAME="${ADMIN_TENANT_NAME}"
+EOF
diff --git a/docker/common/neutron/neutron-server/check.sh b/docker/common/neutron/neutron-server/check.sh
new file mode 100755
index 000000000..4e9aa623c
--- /dev/null
+++ b/docker/common/neutron/neutron-server/check.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+RES=0
+
+. /openrc
+if ! keystone token-get > /dev/null; then
+ echo "ERROR: keystone token-get failed" >&2
+ RES=1
+else
+ if ! neutron ext-list > /dev/null; then
+ echo "ERROR: neutron ext-list failed" >&2
+ RES=1
+ fi
+fi
+
+exit $RES
+
diff --git a/docker/common/neutron/neutron-server/start.sh b/docker/common/neutron/neutron-server/start.sh
new file mode 100755
index 000000000..fb971083f
--- /dev/null
+++ b/docker/common/neutron/neutron-server/start.sh
@@ -0,0 +1,98 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/config-neutron.sh
+
+: ${NEUTRON_FLAT_NETWORK_NAME:=physnet1}
+: ${NEUTRON_FLAT_NETWORK_INTERFACE:=eth1}
+
+check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
+ KEYSTONE_AUTH_PROTOCOL NOVA_API_SERVICE_HOST \
+ NOVA_KEYSTONE_USER NOVA_KEYSTONE_PASSWORD \
+ NEUTRON_DB_NAME NEUTRON_DB_USER NEUTRON_DB_PASSWORD \
+ NEUTRON_KEYSTONE_USER NEUTRON_KEYSTONE_PASSWORD \
+ ADMIN_TENANT_NAME NEUTRON_SERVER_SERVICE_HOST \
+ PUBLIC_IP NEUTRON_DB_PASSWORD
+fail_unless_os_service_running keystone
+fail_unless_db
+
+mysql -h ${MARIADB_SERVICE_HOST} -u root -p${DB_ROOT_PASSWORD} mysql <<EOF
+CREATE DATABASE IF NOT EXISTS ${NEUTRON_DB_NAME} DEFAULT CHARACTER SET utf8;
+GRANT ALL PRIVILEGES ON ${NEUTRON_DB_NAME}.* TO
+ '${NEUTRON_DB_USER}'@'%' IDENTIFIED BY '${NEUTRON_DB_PASSWORD}'
+
+EOF
+
+export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
+export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v2.0"
+
+# Configure Keystone Service Catalog
+crux user-create -n "${NEUTRON_KEYSTONE_USER}" \
+ -p "${NEUTRON_KEYSTONE_PASSWORD}" \
+ -t "${ADMIN_TENANT_NAME}" \
+ -r admin
+
+crux endpoint-create -n neutron -t network \
+ -I "${KEYSTONE_AUTH_PROTOCOL}://${NEUTRON_SERVER_SERVICE_HOST}:${NEUTRON_SERVER_SERVICE_PORT}" \
+ -P "${KEYSTONE_AUTH_PROTOCOL}://${NEUTRON_SERVER_SERVICE_HOST}:${NEUTRON_SERVER_SERVICE_PORT}" \
+ -A "${KEYSTONE_AUTH_PROTOCOL}://${NEUTRON_SERVER_SERVICE_HOST}:${NEUTRON_SERVER_SERVICE_PORT}"
+
+core_cfg=/etc/neutron/neutron.conf
+ml2_cfg=/etc/neutron/plugins/ml2/ml2_conf.ini
+
+# Logging
+crudini --set /etc/neutron/neutron.conf \
+ DEFAULT \
+ log_file \
+ "${NEUTRON_SERVER_LOG_FILE}"
+
+# Database
+crudini --set $core_cfg \
+ database \
+ connection \
+ "mysql://${NEUTRON_DB_USER}:${NEUTRON_DB_PASSWORD}@${MARIADB_SERVICE_HOST}/${NEUTRON_DB_NAME}"
+# Nova
+crudini --set $core_cfg \
+ DEFAULT \
+ notify_nova_on_port_status_changes \
+ "True"
+crudini --set $core_cfg \
+ DEFAULT \
+ notify_nova_on_port_data_changes \
+ "True"
+crudini --set $core_cfg \
+ DEFAULT \
+ nova_url \
+ "http://${NOVA_API_SERVICE_HOST}:${NOVA_API_SERVICE_PORT}/v2"
+crudini --set $core_cfg \
+ DEFAULT \
+ nova_admin_auth_url \
+ "${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v2.0"
+crudini --set $core_cfg \
+ DEFAULT \
+ nova_region_name \
+ "${KEYSTONE_REGION}"
+crudini --set $core_cfg \
+ DEFAULT \
+ nova_admin_username \
+ "${NOVA_KEYSTONE_USER}"
+crudini --set $core_cfg \
+ DEFAULT \
+ nova_admin_tenant_id \
+ "$(keystone tenant-list | grep $ADMIN_TENANT_NAME | awk '{print $2;}')"
+crudini --set $core_cfg \
+ DEFAULT \
+ nova_admin_password \
+ "${NOVA_KEYSTONE_PASSWORD}"
+
+if [[ ${MECHANISM_DRIVERS} =~ linuxbridge ]]; then
+ crudini --set $ml2_cfg \
+ linux_bridge \
+ physical_interface_mappings \
+ "${NEUTRON_FLAT_NETWORK_NAME}:${NEUTRON_FLAT_NETWORK_INTERFACE}"
+fi
+
+su -s /bin/bash -c "neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron
+
+exec /usr/bin/neutron-server --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini
diff --git a/docker/common/nova-base/config-nova.sh b/docker/common/nova-base/config-nova.sh
new file mode 100755
index 000000000..8789a14a5
--- /dev/null
+++ b/docker/common/nova-base/config-nova.sh
@@ -0,0 +1,137 @@
+#!/bin/bash
+
+. /opt/kolla/kolla-common.sh
+
+: ${NOVA_DB_USER:=nova}
+: ${NOVA_DB_NAME:=nova}
+: ${NOVA_KEYSTONE_USER:=admin}
+: ${NOVA_KEYSTONE_PASSWORD:=kolla}
+: ${ADMIN_TENANT_NAME:=admin}
+: ${RABBIT_USERID:=guest}
+: ${RABBIT_PASSWORD:=guest}
+: ${NETWORK_MANAGER:=nova}
+: ${FLAT_NETWORK:=eth1}
+: ${PUBLIC_NETWORK:=eth0}
+: ${ENABLED_APIS:=ec2,osapi_compute,metadata}
+: ${METADATA_HOST:=$PUBLIC_IP}
+: ${NEUTRON_SHARED_SECRET:=sharedsecret}
+
+check_required_vars KEYSTONE_ADMIN_TOKEN NOVA_DB_PASSWORD \
+ RABBITMQ_SERVICE_HOST GLANCE_API_SERVICE_HOST \
+ KEYSTONE_PUBLIC_SERVICE_HOST PUBLIC_IP \
+ PUBLIC_INTERFACE FLAT_INTERFACE DEBUG_LOGGING \
+ VERBOSE_LOGGING
+
+cfg=/etc/nova/nova.conf
+
+crudini --set $cfg DEFAULT amqp_durable_queues False
+crudini --set $cfg DEFAULT rabbit_host ${RABBITMQ_SERVICE_HOST}
+crudini --set $cfg DEFAULT rabbit_port 5672
+crudini --set $cfg DEFAULT rabbit_hosts ${RABBITMQ_SERVICE_HOST}:5672
+crudini --set $cfg DEFAULT rabbit_use_ssl False
+crudini --set $cfg DEFAULT rabbit_userid ${RABBIT_USERID}
+crudini --set $cfg DEFAULT rabbit_password "${RABBIT_PASSWORD}"
+crudini --set $cfg DEFAULT rabbit_virtual_host /
+crudini --set $cfg DEFAULT rabbit_ha_queues False
+crudini --set $cfg DEFAULT rpc_backend nova.openstack.common.rpc.impl_kombu
+crudini --set $cfg DEFAULT enabled_apis ${ENABLED_APIS}
+crudini --set $cfg DEFAULT ec2_listen 0.0.0.0
+crudini --set $cfg DEFAULT osapi_compute_listen 0.0.0.0
+crudini --set $cfg DEFAULT osapi_compute_workers 8
+crudini --set $cfg DEFAULT metadata_host ${METADATA_HOST}
+crudini --set $cfg DEFAULT metadata_listen 0.0.0.0
+crudini --set $cfg DEFAULT metadata_workers 8
+crudini --set $cfg DEFAULT service_down_time 60
+crudini --set $cfg DEFAULT rootwrap_config /etc/nova/rootwrap.conf
+crudini --set $cfg DEFAULT auth_strategy keystone
+crudini --set $cfg DEFAULT use_forwarded_for False
+crudini --set $cfg DEFAULT glance_api_servers ${GLANCE_API_SERVICE_HOST}:9292
+crudini --set $cfg DEFAULT cpu_allocation_ratio 16.0
+crudini --set $cfg DEFAULT ram_allocation_ratio 1.5
+crudini --set $cfg DEFAULT scheduler_default_filters RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,CoreFilter
+crudini --set $cfg DEFAULT compute_driver nova.virt.libvirt.LibvirtDriver
+crudini --set $cfg DEFAULT vif_plugging_is_fatal True
+crudini --set $cfg DEFAULT vif_plugging_timeout 300
+crudini --set $cfg DEFAULT volume_api_class nova.volume.cinder.API
+crudini --set $cfg DEFAULT image_service nova.image.glance.GlanceImageService
+crudini --set $cfg DEFAULT osapi_volume_listen 0.0.0.0
+crudini --set $cfg DEFAULT instances_path /var/lib/nova/instances
+crudini --set $cfg DEFAULT lock_path /var/lib/nova/lock
+
+# This is not created by openstack-nova packaging
+mkdir -p /var/lib/nova/lock
+
+# configure logging
+crudini --set $cfg DEFAULT log_dir "${NOVA_LOG_DIR}"
+crudini --set $cfg DEFAULT debug "${DEBUG_LOGGING}"
+crudini --set $cfg DEFAULT verbose "${VERBOSE_LOGGING}"
+
+crudini --set $cfg DEFAULT admin_token "${KEYSTONE_ADMIN_TOKEN}"
+
+crudini --set $cfg conductor workers 8
+
+if [ "${NETWORK_MANAGER}" == "nova" ] ; then
+ crudini --set $cfg DEFAULT network_manager nova.network.manager.FlatDHCPManager
+ crudini --set $cfg DEFAULT firewall_driver nova.virt.libvirt.firewall.IptablesFirewallDriver
+ crudini --set $cfg DEFAULT network_size 254
+ crudini --set $cfg DEFAULT allow_same_net_traffic False
+ crudini --set $cfg DEFAULT multi_host True
+ crudini --set $cfg DEFAULT send_arp_for_ha True
+ crudini --set $cfg DEFAULT share_dhcp_address True
+ crudini --set $cfg DEFAULT force_dhcp_release True
+ crudini --set $cfg DEFAULT flat_interface $FLAT_INTERFACE
+ crudini --set $cfg DEFAULT flat_network_bridge br100
+ crudini --set $cfg DEFAULT public_interface $PUBLIC_INTERFACE
+elif [ "${NETWORK_MANAGER}" == "neutron" ] ; then
+ check_required_vars NEUTRON_SHARED_SECRET
+ crudini --set $cfg neutron service_metadata_proxy True
+ crudini --set $cfg neutron metadata_proxy_shared_secret ${NEUTRON_SHARED_SECRET}
+ crudini --set $cfg DEFAULT neutron_default_tenant_id default
+ crudini --set $cfg DEFAULT network_api_class nova.network.neutronv2.api.API
+ crudini --set $cfg DEFAULT security_group_api neutron
+ if [[ "${MECHANISM_DRIVERS}" =~ linuxbridge ]] ; then
+ crudini --set $cfg DEFAULT linuxnet_interface_driver nova.network.linux_net.NeutronLinuxBridgeInterfaceDriver
+ elif [[ "${MECHANISM_DRIVERS}" =~ openvswitch ]] ; then
+ crudini --set $cfg DEFAULT linuxnet_interface_driver nova.network.linux_net.LinuxOVSInterfaceDriver
+ fi
+ crudini --set $cfg DEFAULT libvirt_vif_driver nova.virt.libvirt.vif.LibvirtGenericVIFDriver
+ crudini --set $cfg DEFAULT firewall_driver nova.virt.firewall.NoopFirewallDriver
+ crudini --set $cfg neutron url http://${NEUTRON_SERVER_SERVICE_HOST}:${NEUTRON_SERVER_SERVICE_PORT}
+ crudini --set $cfg neutron auth_strategy keystone
+ crudini --set $cfg neutron admin_auth_url ${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:${KEYSTONE_ADMIN_SERVICE_PORT}/v2.0
+ crudini --set $cfg neutron admin_tenant_name ${ADMIN_TENANT_NAME}
+ crudini --set $cfg neutron admin_username ${NEUTRON_KEYSTONE_USER}
+ crudini --set $cfg neutron admin_password ${NEUTRON_KEYSTONE_PASSWORD}
+else
+ echo "Incorrect NETWORK_MANAGER ${NETWORK_MANAGER}. Supported options are nova and neutron."
+ exit 1
+fi
+
+# disabled pending answers to http://lists.openstack.org/pipermail/openstack/2014-October/009997.html
+#for option in auth_protocol auth_host auth_port; do
+# crudini --del $cfg \
+# keystone_authtoken \
+# $option
+#done
+
+crudini --set $cfg keystone_authtoken auth_uri "http://${KEYSTONE_PUBLIC_SERVICE_HOST}:5000/"
+crudini --set $cfg keystone_authtoken auth_protocol http
+crudini --set $cfg keystone_authtoken auth_host ${KEYSTONE_PUBLIC_SERVICE_HOST}
+crudini --set $cfg keystone_authtoken auth_port 5000
+
+crudini --set $cfg keystone_authtoken admin_user ${NOVA_KEYSTONE_USER}
+crudini --set $cfg keystone_authtoken admin_password "${NOVA_KEYSTONE_PASSWORD}"
+crudini --set $cfg keystone_authtoken admin_tenant_name ${ADMIN_TENANT_NAME}
+
+cat > /openrc <<EOF
+export OS_AUTH_URL="http://${KEYSTONE_PUBLIC_SERVICE_HOST}:5000/v2.0"
+export OS_USERNAME="${NOVA_KEYSTONE_USER}"
+export OS_PASSWORD="${NOVA_KEYSTONE_PASSWORD}"
+export OS_TENANT_NAME="${ADMIN_TENANT_NAME}"
+EOF
+
+# Configure database connection
+crudini --set $cfg \
+ database \
+ connection \
+ "mysql://${NOVA_DB_USER}:${NOVA_DB_PASSWORD}@${MARIADB_SERVICE_HOST}/${NOVA_DB_NAME}"
diff --git a/docker/common/nova-compute/nova-compute/config-nova-compute.sh b/docker/common/nova-compute/nova-compute/config-nova-compute.sh
new file mode 100755
index 000000000..9a2c12572
--- /dev/null
+++ b/docker/common/nova-compute/nova-compute/config-nova-compute.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+. /opt/kolla/kolla-common.sh
+. /opt/kolla/config-nova.sh
+
+cfg=/etc/nova/nova.conf
+
+check_required_vars NOVA_VNCSERVER_PROXYCLIENT_ADDRESS NOVA_NOVNC_PROXY_PORT \
+ NOVA_NOVNC_BASE_ADDRESS
+
+# Configures novnc to listen on all interfaces and instructs nova-compute to
+# announce PROXYCLIENT_IP to the nova-vncproxy. Clients like Horizon will
+# connect with this address.
+# As such, NOVA_VNCSERVER_PROXYCLIENT_ADDRESS is unique per compute node.
+crudini --set $cfg DEFAULT vnc_enabled "True"
+crudini --set $cfg DEFAULT vncserver_listen "0.0.0.0"
+crudini --set $cfg DEFAULT vncserver_proxyclient_address "${NOVA_VNCSERVER_PROXYCLIENT_ADDRESS}"
+crudini --set $cfg DEFAULT novncproxy_base_url "http://${NOVA_NOVNC_BASE_ADDRESS}:${NOVA_NOVNC_PROXY_PORT}/vnc_auto.html"
+
+# configure logging
+crudini --set $cfg DEFAULT log_file "${NOVA_COMPUTE_LOG_FILE}"
+
+# set qmeu emulation if no hardware acceleration found
+if [[ `egrep -c '(vmx|svm)' /proc/cpuinfo` == 0 ]]; then
+ crudini --set $cfg libvirt virt_type qemu
+fi
+
+mkdir -p /var/lib/nova/instances
diff --git a/docker/common/nova-compute/nova-compute/start.sh b/docker/common/nova-compute/nova-compute/start.sh
new file mode 100755
index 000000000..ce3d0c0c3
--- /dev/null
+++ b/docker/common/nova-compute/nova-compute/start.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/config-nova-compute.sh
+
+sleep 6
+
+echo "Starting nova-compute."
+exec /usr/bin/nova-compute --config-file /etc/nova/nova.conf
diff --git a/docker/common/nova-compute/nova-libvirt/start.sh b/docker/common/nova-compute/nova-libvirt/start.sh
new file mode 100755
index 000000000..bdbe882b8
--- /dev/null
+++ b/docker/common/nova-compute/nova-libvirt/start.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+if [[ $(cat /proc/cpuinfo | grep vmx) ]]; then
+ modprobe kvm_intel
+elif [[ $(cat /proc/cpuinfo | grep svm) ]]; then
+ modprobe kvm_amd
+else
+ echo "WARNING: Your hardware does not support hardware virtualization -" \
+ "using qemu software virtualization instead"
+fi
+
+modprobe ip6_tables ip_tables ebtable_nat
+
+# If libvirt is not installed on the host permissions need to be set
+# If running in qemu, we don't need to set anything as /dev/kvm won't exist
+if [[ -c /dev/kvm ]]; then
+ chmod 660 /dev/kvm
+ chown root:kvm /dev/kvm
+fi
+
+echo "Starting libvirtd."
+exec /usr/sbin/libvirtd
diff --git a/docker/common/nova-compute/nova-network/config-nova-network.sh b/docker/common/nova-compute/nova-network/config-nova-network.sh
new file mode 100755
index 000000000..6976d3a20
--- /dev/null
+++ b/docker/common/nova-compute/nova-network/config-nova-network.sh
@@ -0,0 +1,30 @@
+#!/bin/bash
+
+. /opt/kolla/config-nova.sh
+
+cfg=/etc/nova/nova.conf
+
+# configure logging
+crudini --set $cfg DEFAULT log_file "${NOVA_NETWORK_LOG_FILE}"
+
+# Configure eth1 as a physcial interface for nova flat network
+cat > /etc/sysconfig/network-scripts/ifcfg-$FLAT_INTERFACE <<EOF
+DEVICE="$FLAT_INTERFACE"
+BOOTPROTO="none"
+ONBOOT="yes"
+TYPE="Ethernet"
+EOF
+
+/usr/sbin/ifup $FLAT_INTERFACE
+
+cfg=/etc/nova/nova.conf
+
+crudini --set $cfg DEFAULT network_manager nova.network.manager.FlatDHCPManager
+crudini --set $cfg DEFAULT firewall_driver nova.virt.libvirt.firewall.IptablesFirewallDriver
+crudini --set $cfg DEFAULT network_size 254
+crudini --set $cfg DEFAULT allow_same_net_traffic False
+crudini --set $cfg DEFAULT multi_host True
+crudini --set $cfg DEFAULT send_arp_for_ha True
+crudini --set $cfg DEFAULT share_dhcp_address True
+crudini --set $cfg DEFAULT force_dhcp_release True
+crudini --set $cfg DEFAULT flat_network_bridge br100
diff --git a/docker/common/nova-compute/nova-network/start.sh b/docker/common/nova-compute/nova-network/start.sh
new file mode 100755
index 000000000..92381b720
--- /dev/null
+++ b/docker/common/nova-compute/nova-network/start.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/config-nova-network.sh
+
+# Start nova-network
+exec /usr/bin/nova-network --config-file /etc/nova/nova.conf
diff --git a/docker/common/nova-controller/nova-api/check.sh b/docker/common/nova-controller/nova-api/check.sh
new file mode 100755
index 000000000..b250682d8
--- /dev/null
+++ b/docker/common/nova-controller/nova-api/check.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+RES=0
+
+. /openrc
+if ! keystone token-get > /dev/null; then
+ echo "ERROR: keystone token-get failed" >&2
+ RES=1
+else
+ if ! nova list > /dev/null; then
+ echo "ERROR: nova list failed" >&2
+ RES=1
+ fi
+fi
+
+exit $RES
+
diff --git a/docker/common/nova-controller/nova-api/start.sh b/docker/common/nova-controller/nova-api/start.sh
new file mode 100755
index 000000000..7928370a4
--- /dev/null
+++ b/docker/common/nova-controller/nova-api/start.sh
@@ -0,0 +1,46 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/config-nova.sh
+
+check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
+ NOVA_KEYSTONE_USER NOVA_KEYSTONE_PASSWORD \
+ ADMIN_TENANT_NAME NOVA_API_SERVICE_HOST \
+ NOVA_EC2_API_SERVICE_HOST PUBLIC_IP NOVA_DB_NAME
+fail_unless_os_service_running keystone
+fail_unless_db $NOVA_DB_NAME
+
+export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
+export SERVICE_ENDPOINT="http://${KEYSTONE_ADMIN_SERVICE_HOST}:35357/v2.0"
+
+cfg=/etc/nova/nova.conf
+
+# configure logging
+crudini --set $cfg DEFAULT log_file "${NOVA_API_LOG_FILE}"
+
+crux user-create --update \
+ -n "${NOVA_KEYSTONE_USER}" \
+ -p "${NOVA_KEYSTONE_PASSWORD}" \
+ -t "${ADMIN_TENANT_NAME}" \
+ -r admin
+
+crux endpoint-create --remove-all \
+ -n ec2 -t ec2 \
+ -I "http://${NOVA_EC2_API_SERVICE_HOST}:8773/services/Cloud" \
+ -P "http://${PUBLIC_IP}:8773/services/Cloud" \
+ -A "http://${NOVA_EC2_API_SERVICE_HOST}:8773/services/Admin"
+
+crux endpoint-create --remove-all \
+ -n nova -t compute \
+ -I "http://${NOVA_API_SERVICE_HOST}:8774/v2/\$(tenant_id)s" \
+ -P "http://${PUBLIC_IP}:8774/v2/\$(tenant_id)s" \
+ -A "http://${NOVA_API_SERVICE_HOST}:8774/v2/\$(tenant_id)s"
+
+crux endpoint-create --remove-all \
+ -n novav3 -t computev3 \
+ -I "http://${NOVA_API_SERVICE_HOST}:8774/v3" \
+ -P "http://${PUBLIC_IP}:8774/v3" \
+ -A "http://${NOVA_API_SERVICE_HOST}:8774/v3"
+
+exec /usr/bin/nova-api --config-file /etc/nova/nova.conf
diff --git a/docker/common/nova-controller/nova-conductor/start.sh b/docker/common/nova-controller/nova-conductor/start.sh
new file mode 100755
index 000000000..575e7ff6c
--- /dev/null
+++ b/docker/common/nova-controller/nova-conductor/start.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/config-nova.sh
+
+check_required_vars NOVA_DB_NAME NOVA_DB_USER NOVA_DB_PASSWORD
+fail_unless_db
+
+cfg=/etc/nova/nova.conf
+
+# configure logging
+crudini --set $cfg DEFAULT log_file "${NOVA_CONDUCTOR_LOG_FILE}"
+
+mysql -h ${MARIADB_SERVICE_HOST} -u root -p${DB_ROOT_PASSWORD} mysql <<EOF
+CREATE DATABASE IF NOT EXISTS ${NOVA_DB_NAME};
+GRANT ALL PRIVILEGES ON ${NOVA_DB_NAME}.* TO
+ '${NOVA_DB_USER}'@'%' IDENTIFIED BY '${NOVA_DB_PASSWORD}'
+EOF
+
+nova-manage db sync
+
+exec /usr/bin/nova-conductor --config-file /etc/nova/nova.conf
diff --git a/docker/common/nova-controller/nova-consoleauth/start.sh b/docker/common/nova-controller/nova-consoleauth/start.sh
new file mode 100755
index 000000000..a1b0864ac
--- /dev/null
+++ b/docker/common/nova-controller/nova-consoleauth/start.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+set -e
+
+. /opt/kolla/config-nova.sh
+
+cfg=/etc/nova/nova.conf
+
+crudini --set $cfg DEFAULT log_file "${NOVA_CONSOLEAUTH_LOG_FILE}"
+
+echo Starting nova-consoleauth
+exec /usr/bin/nova-consoleauth
diff --git a/docker/common/nova-controller/nova-novncproxy/start.sh b/docker/common/nova-controller/nova-novncproxy/start.sh
new file mode 100755
index 000000000..9edafbca3
--- /dev/null
+++ b/docker/common/nova-controller/nova-novncproxy/start.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+set -e
+. /opt/kolla/kolla-common.sh
+
+cfg=/etc/nova/nova.conf
+
+check_required_vars PUBLIC_IP NOVA_NOVNC_PROXY_SERVICE_HOST NOVA_NOVNC_PROXY_PORT \
+ NOVA_NOVNC_BASE_ADDRESS NOVA_VNCSERVER_LISTEN_ADDRESS \
+ NOVA_VNCSERVER_PROXYCLIENT_ADDRESS
+
+crudini --set $cfg DEFAULT log_file "${NOVA_NOVNCPROXY_LOG_FILE}"
+
+# Listen on all interfaces on port $NOVA_NOVNC_PROXY_PORT for incoming novnc
+# requests.
+# The base_url is given to clients to connect to, like Horizon, so this could
+# very well be fancy DNS name.
+echo Configuring VNC...
+crudini --set $cfg DEFAULT vncserver_listen "${NOVA_VNCSERVER_LISTEN_ADDRESS}"
+crudini --set $cfg DEFAULT vncserver_proxyclient_address "${NOVA_VNCSERVER_PROXYCLIENT_ADDRESS}"
+
+echo Starting nova-novncproxy
+exec /usr/bin/nova-novncproxy
diff --git a/docker/common/nova-controller/nova-scheduler/start.sh b/docker/common/nova-controller/nova-scheduler/start.sh
new file mode 100755
index 000000000..504c049ed
--- /dev/null
+++ b/docker/common/nova-controller/nova-scheduler/start.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/config-nova.sh
+
+check_required_vars NOVA_DB_NAME
+fail_unless_db $NOVA_DB_NAME
+
+cfg=/etc/nova/nova.conf
+
+# configure logging
+crudini --set $cfg DEFAULT log_file "${NOVA_SCHEDULER_LOG_FILE}"
+
+exec /usr/bin/nova-scheduler --config-file /etc/nova/nova.conf
diff --git a/docker/common/rabbitmq/rabbitmq-env.conf b/docker/common/rabbitmq/rabbitmq-env.conf
new file mode 100644
index 000000000..e76f18f0b
--- /dev/null
+++ b/docker/common/rabbitmq/rabbitmq-env.conf
@@ -0,0 +1,2 @@
+RABBITMQ_NODENAME=@RABBITMQ_NODENAME@
+RABBITMQ_LOG_BASE=@RABBITMQ_LOG_BASE@
diff --git a/docker/common/rabbitmq/rabbitmq.config b/docker/common/rabbitmq/rabbitmq.config
new file mode 100644
index 000000000..15a47eba1
--- /dev/null
+++ b/docker/common/rabbitmq/rabbitmq.config
@@ -0,0 +1,11 @@
+[
+ {rabbit, [
+ {default_user, <<"@RABBITMQ_USER@">>},
+ {default_pass, <<"@RABBITMQ_PASS@">>}
+ ]},
+ {kernel, [
+
+ ]}
+].
+% EOF
+
diff --git a/docker/common/rabbitmq/start.sh b/docker/common/rabbitmq/start.sh
new file mode 100755
index 000000000..f70c34866
--- /dev/null
+++ b/docker/common/rabbitmq/start.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+set -e
+
+: ${RABBITMQ_USER:=guest}
+: ${RABBITMQ_PASS:=guest}
+: ${RABBITMQ_NODENAME:=rabbit}
+: ${RABBITMQ_LOG_BASE:=/var/log/rabbitmq}
+
+sed -i '
+ s|@RABBITMQ_USER@|'"$RABBITMQ_USER"'|g
+ s|@RABBITMQ_PASS@|'"$RABBITMQ_PASS"'|g
+' /etc/rabbitmq/rabbitmq.config
+
+sed -i '
+ s|@RABBITMQ_NODENAME@|'"$RABBITMQ_NODENAME"'|g
+ s|@RABBITMQ_LOG_BASE@|'"$RABBITMQ_LOG_BASE"'|g
+' /etc/rabbitmq/rabbitmq-env.conf
+
+# work around:
+# https://bugs.launchpad.net/ubuntu/+source/rabbitmq-server/+bug/653405
+echo "${RABBITMQ_SERVICE_HOST} `/usr/bin/hostname -s`" > /etc/hosts
+
+exec /usr/sbin/rabbitmq-server
diff --git a/docker/common/swift/swift-account/start.sh b/docker/common/swift/swift-account/start.sh
new file mode 100644
index 000000000..bf86830f9
--- /dev/null
+++ b/docker/common/swift/swift-account/start.sh
@@ -0,0 +1,34 @@
+#!/bin/bash
+
+: ${SWIFT_DB_USER:=swift}
+: ${SWIFT_DB_NAME:=swift}
+: ${KEYSTONE_AUTH_PROTOCOL:=http}
+: ${SWIFT_KEYSTONE_USER:=swift}
+: ${ADMIN_TENANT_NAME:=admin}
+
+check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
+ SWIFT_ADMIN_PASSWORD
+fail_unless_db
+fail_unless_os_service_running keystone
+
+if ! [ "$SWIFT_DB_PASSWORD" ]; then
+ SWIFT_DB_PASSWORD=$(openssl rand -hex 15)
+ export SWIFT_DB_PASSWORD
+fi
+
+sh /opt/swift/config-swift.sh account-server
+
+mysql -h ${MARIADB_SERVICE_HOST} -u root -p${DB_ROOT_PASSWORD} mysql <<EOF
+CREATE DATABASE IF NOT EXISTS ${SWIFT_DB_NAME};
+GRANT ALL PRIVILEGES ON swift* TO
+'${SWIFT_DB_USER}'@'%' IDENTIFIED BY '${SWIFT_DB_PASSWORD}'
+EOF
+
+export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
+export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:35357/v2.0"
+
+/bin/keystone user-create --name ${SWIFT_KEYSTONE_USER} --pass ${SWIFT_ADMIN_PASSWORD}
+/bin/keystone role-create --name ${SWIFT_KEYSTONE_USER}
+/bin/keystone user-role-add --user ${SWIFT_KEYSTONE_USER} --role admin --tenant ${ADMIN_TENANT_NAME}
+
+exec /usr/bin/swift-engine
diff --git a/docker/common/swift/swift-container/start.sh b/docker/common/swift/swift-container/start.sh
new file mode 100644
index 000000000..42d4ccf35
--- /dev/null
+++ b/docker/common/swift/swift-container/start.sh
@@ -0,0 +1,34 @@
+#!/bin/bash
+
+: ${SWIFT_DB_USER:=swift}
+: ${SWIFT_DB_NAME:=swift}
+: ${KEYSTONE_AUTH_PROTOCOL:=http}
+: ${SWIFT_KEYSTONE_USER:=swift}
+: ${ADMIN_TENANT_NAME:=admin}
+
+check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
+ SWIFT_ADMIN_PASSWORD
+fail_unless_db
+fail_unless_os_service_running keystone
+
+if ! [ "$SWIFT_DB_PASSWORD" ]; then
+ SWIFT_DB_PASSWORD=$(openssl rand -hex 15)
+ export SWIFT_DB_PASSWORD
+fi
+
+sh /opt/swift/config-swift.sh container
+
+mysql -h ${MARIADB_SERVICE_HOST} -u root -p${DB_ROOT_PASSWORD} mysql <<EOF
+CREATE DATABASE IF NOT EXISTS ${SWIFT_DB_NAME};
+GRANT ALL PRIVILEGES ON swift* TO
+'${SWIFT_DB_USER}'@'%' IDENTIFIED BY '${SWIFT_DB_PASSWORD}'
+EOF
+
+export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
+export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:35357/v2.0"
+
+/bin/keystone user-create --name ${SWIFT_KEYSTONE_USER} --pass ${SWIFT_ADMIN_PASSWORD}
+/bin/keystone role-create --name ${SWIFT_KEYSTONE_USER}
+/bin/keystone user-role-add --user ${SWIFT_KEYSTONE_USER} --role admin --tenant ${ADMIN_TENANT_NAME}
+
+exec /usr/bin/swift-container-server
diff --git a/docker/common/swift/swift-object/start.sh b/docker/common/swift/swift-object/start.sh
new file mode 100644
index 000000000..7ed97536e
--- /dev/null
+++ b/docker/common/swift/swift-object/start.sh
@@ -0,0 +1,34 @@
+#!/bin/bash
+
+: ${SWIFT_DB_USER:=swift}
+: ${SWIFT_DB_NAME:=swift}
+: ${KEYSTONE_AUTH_PROTOCOL:=http}
+: ${SWIFT_KEYSTONE_USER:=swift}
+: ${ADMIN_TENANT_NAME:=admin}
+
+check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
+ SWIFT_ADMIN_PASSWORD
+fail_unless_db
+fail_unless_os_service_running keystone
+
+if ! [ "$SWIFT_DB_PASSWORD" ]; then
+ SWIFT_DB_PASSWORD=$(openssl rand -hex 15)
+ export SWIFT_DB_PASSWORD
+fi
+
+sh /opt/swift/config-swift.sh engine
+
+mysql -h ${MARIADB_SERVICE_HOST} -u root -p${DB_ROOT_PASSWORD} mysql <<EOF
+CREATE DATABASE IF NOT EXISTS ${SWIFT_DB_NAME};
+GRANT ALL PRIVILEGES ON swift* TO
+'${SWIFT_DB_USER}'@'%' IDENTIFIED BY '${SWIFT_DB_PASSWORD}'
+EOF
+
+export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
+export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:35357/v2.0"
+
+/bin/keystone user-create --name ${SWIFT_KEYSTONE_USER} --pass ${SWIFT_ADMIN_PASSWORD}
+/bin/keystone role-create --name ${SWIFT_KEYSTONE_USER}
+/bin/keystone user-role-add --user ${SWIFT_KEYSTONE_USER} --role admin --tenant ${ADMIN_TENANT_NAME}
+
+exec /usr/bin/swift-object-server
diff --git a/docker/common/swift/swift-proxy-server/start.sh b/docker/common/swift/swift-proxy-server/start.sh
new file mode 100644
index 000000000..3f387d187
--- /dev/null
+++ b/docker/common/swift/swift-proxy-server/start.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+sh /opt/swift/config-swift.sh proxy
+
+exec /usr/bin/swift-proxy-server
diff --git a/docker/common/zaqar/check.sh b/docker/common/zaqar/check.sh
new file mode 100755
index 000000000..4b3cdbb46
--- /dev/null
+++ b/docker/common/zaqar/check.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+status=$(curl -s -w "%{http_code}" -o /dev/null http://localhost:8888/v1/queues)
+
+if [[ $status -ne 200 && $status -ne 204 ]]; then
+ echo "ERROR($status): queue list failed"
+ exit $status
+fi
+
+exit 0
diff --git a/docker/common/zaqar/start.sh b/docker/common/zaqar/start.sh
new file mode 100755
index 000000000..6c68fccf2
--- /dev/null
+++ b/docker/common/zaqar/start.sh
@@ -0,0 +1,64 @@
+#!/bin/sh
+
+set -e
+
+. /opt/kolla/kolla-common.sh
+
+: ${ADMIN_TENANT_NAME:=admin}
+: ${ZAQAR_KEYSTONE_USER:=zaqar}
+: ${KEYSTONE_AUTH_PROTOCOL:=http}
+
+check_required_vars ZAQAR_KEYSTONE_PASSWORD ZAQAR_SERVER_SERVICE_HOST \
+ KEYSTONE_ADMIN_SERVICE_HOST KEYSTONE_ADMIN_TOKEN \
+ PUBLIC_IP
+dump_vars
+
+#check_for_mongodb
+check_for_keystone
+
+cat > /openrc <<EOF
+export OS_AUTH_URL="http://${KEYSTONE_PUBLIC_SERVICE_HOST}:5000/v2.0"
+export OS_USERNAME="${ZAQAR_KEYSTONE_USER}"
+export OS_PASSWORD="${ZAQAR_KEYSTONE_PASSWORD}"
+export OS_TENANT_NAME="${ADMIN_TENANT_NAME}"
+EOF
+
+cfg=/etc/zaqar/zaqar.conf
+
+crudini --set $cfg DEFAULT log_file \
+ ""
+crudini --set $cfg DEFAULT use_stderr \
+ true
+
+crudini --set $cfg drivers storage \
+ sqlite
+
+crudini --set $cfg keystone_authtoken admin_password \
+ "${ZAQAR_KEYSTONE_PASSWORD}"
+crudini --set $cfg keystone_authtoken admin_user \
+ "${ZAQAR_KEYSTONE_USER}"
+crudini --set $cfg keystone_authtoken admin_tenant_name \
+ "${ADMIN_TENANT_NAME}"
+crudini --set $cfg keystone_authtoken auth_uri \
+ "${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_PUBLIC_SERVICE_HOST}:5000/v2.0"
+crudini --set $cfg keystone_authtoken auth_protocol \
+ "${KEYSTONE_AUTH_PROTOCOL}"
+crudini --set $cfg keystone_authtoken auth_host \
+ "${KEYSTONE_PUBLIC_SERVICE_HOST}"
+crudini --set $cfg keystone_authtoken auth_port \
+ 5000
+
+
+export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
+export SERVICE_ENDPOINT="${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_ADMIN_SERVICE_HOST}:35357/v2.0"
+crux user-create -n ${ZAQAR_KEYSTONE_USER} \
+ -p ${ZAQAR_KEYSTONE_PASSWORD} \
+ -t ${ADMIN_TENANT_NAME} \
+ -r admin
+
+crux endpoint-create --remove-all -n ${ZAQAR_KEYSTONE_USER} -t messaging \
+ -I "${KEYSTONE_AUTH_PROTOCOL}://${ZAQAR_SERVER_SERVICE_HOST}:8888" \
+ -P "${KEYSTONE_AUTH_PROTOCOL}://${PUBLIC_IP}:8888" \
+ -A "${KEYSTONE_AUTH_PROTOCOL}://${ZAQAR_SERVER_SERVICE_HOST}:8888"
+
+exec /usr/bin/zaqar-server
diff --git a/docker/fedora/binary/base/kolla-common.sh b/docker/fedora/binary/base/kolla-common.sh
index 380efbc3d..c265c62f7 120000
--- a/docker/fedora/binary/base/kolla-common.sh
+++ b/docker/fedora/binary/base/kolla-common.sh
@@ -1 +1 @@
-../../../common/kolla-common.sh \ No newline at end of file
+../../../common/base/kolla-common.sh \ No newline at end of file
diff --git a/docker/fedora/binary/base/service_hosts.sh b/docker/fedora/binary/base/service_hosts.sh
index 777b7334d..06e045440 120000
--- a/docker/fedora/binary/base/service_hosts.sh
+++ b/docker/fedora/binary/base/service_hosts.sh
@@ -1 +1 @@
-../../../common/service_hosts.sh \ No newline at end of file
+../../../common/base/service_hosts.sh \ No newline at end of file
diff --git a/docker/rhel/binary/base/kolla-common.sh b/docker/rhel/binary/base/kolla-common.sh
index 380efbc3d..c265c62f7 120000
--- a/docker/rhel/binary/base/kolla-common.sh
+++ b/docker/rhel/binary/base/kolla-common.sh
@@ -1 +1 @@
-../../../common/kolla-common.sh \ No newline at end of file
+../../../common/base/kolla-common.sh \ No newline at end of file
diff --git a/docker/rhel/binary/base/service_hosts.sh b/docker/rhel/binary/base/service_hosts.sh
index 777b7334d..06e045440 120000
--- a/docker/rhel/binary/base/service_hosts.sh
+++ b/docker/rhel/binary/base/service_hosts.sh
@@ -1 +1 @@
-../../../common/service_hosts.sh \ No newline at end of file
+../../../common/base/service_hosts.sh \ No newline at end of file