aboutsummaryrefslogtreecommitdiff
path: root/docker/neutron
diff options
context:
space:
mode:
authorSam Yaple <sam@yaple.net>2015-08-28 12:16:53 +0000
committerSam Yaple <sam@yaple.net>2015-08-28 13:33:50 +0000
commitcbd42ca6e90cca2ff4b84f5e4e46224e6455e8b2 (patch)
tree2e4256b6b7b8339da11b1d17250378596e61605b /docker/neutron
parent3b5380ade021c9884551f427441cbfc0122eb0f0 (diff)
downloadkolla-cbd42ca6e90cca2ff4b84f5e4e46224e6455e8b2.tar.gz
kolla-cbd42ca6e90cca2ff4b84f5e4e46224e6455e8b2.zip
Move docker_templates to docker dir
Updated build.py to reflect this change. Deprecate --template option and make it a noop. Change-Id: I7cd98d1ee684a4c64984a49597159868152683b2 Partially-Implements: blueprint remove-docker-dir
Diffstat (limited to 'docker/neutron')
-rw-r--r--docker/neutron/neutron-agents/Dockerfile.j235
l---------docker/neutron/neutron-agents/fwaas_driver.ini1
-rwxr-xr-xdocker/neutron/neutron-agents/neutron-dhcp-agent/config-external.sh13
-rwxr-xr-xdocker/neutron/neutron-agents/neutron-dhcp-agent/start.sh37
-rwxr-xr-xdocker/neutron/neutron-agents/neutron-l3-agent/config-external.sh23
-rw-r--r--docker/neutron/neutron-agents/neutron-l3-agent/fwaas_driver.ini3
-rwxr-xr-xdocker/neutron/neutron-agents/neutron-l3-agent/start.sh37
-rwxr-xr-xdocker/neutron/neutron-agents/neutron-metadata-agent/config-external.sh13
-rwxr-xr-xdocker/neutron/neutron-agents/neutron-metadata-agent/start.sh37
-rw-r--r--docker/neutron/neutron-agents/supervisord.conf40
-rw-r--r--docker/neutron/neutron-base/Dockerfile.j247
-rw-r--r--docker/neutron/neutron-base/config-sudoers.sh12
-rwxr-xr-xdocker/neutron/neutron-base/ip_wrapper.py66
-rw-r--r--docker/neutron/neutron-linuxbridge-agent/Dockerfile.j228
-rwxr-xr-xdocker/neutron/neutron-linuxbridge-agent/config-external.sh20
-rwxr-xr-xdocker/neutron/neutron-linuxbridge-agent/start.sh14
-rw-r--r--docker/neutron/neutron-openvswitch-agent/Dockerfile.j232
-rwxr-xr-xdocker/neutron/neutron-openvswitch-agent/config-external.sh20
-rwxr-xr-xdocker/neutron/neutron-openvswitch-agent/start.sh14
-rw-r--r--docker/neutron/neutron-server/Dockerfile.j231
-rwxr-xr-xdocker/neutron/neutron-server/config-external.sh20
-rwxr-xr-xdocker/neutron/neutron-server/start.sh20
22 files changed, 563 insertions, 0 deletions
diff --git a/docker/neutron/neutron-agents/Dockerfile.j2 b/docker/neutron/neutron-agents/Dockerfile.j2
new file mode 100644
index 000000000..590443e00
--- /dev/null
+++ b/docker/neutron/neutron-agents/Dockerfile.j2
@@ -0,0 +1,35 @@
+FROM {{ namespace }}/{{ base_distro }}-{{ install_type }}-neutron-base:{{ tag }}
+MAINTAINER Kolla Project (https://launchpad.net.kolla)
+
+{% if base_distro in ['centos', 'fedora', 'oraclelinux'] %}
+
+RUN yum install -y supervisor \
+ && yum clean all
+
+COPY supervisord.conf /etc/
+
+{% elif base_distro in ['ubuntu', 'debian'] %}
+
+RUN apt-get install -y --no-install-recommends supervisor \
+ && apt-get clean
+
+COPY supervisord.conf /etc/supervisor/
+
+{% endif %}
+
+# TODO: SamYaple FWaaS is part of the l3-agent, not a seperate agent that is
+# why this file is needed. To support FWaaS we cannot have a seperate container
+# I need to figure out the best way to make this work together
+#
+# This file _does_ _not_ need to exist, you must remove referencing it from the
+# exec line in the start script. Also all these config options can exist in the
+# main neutron.conf if we wish
+COPY fwaas_driver.ini /etc/neutron/
+
+COPY neutron-dhcp-agent/ /opt/kolla/neutron-dhcp-agent
+COPY neutron-l3-agent/ /opt/kolla/neutron-l3-agent
+COPY neutron-metadata-agent/ /opt/kolla/neutron-metadata-agent
+
+CMD ["/usr/bin/supervisord"]
+
+{{ include_footer }}
diff --git a/docker/neutron/neutron-agents/fwaas_driver.ini b/docker/neutron/neutron-agents/fwaas_driver.ini
new file mode 120000
index 000000000..a9b1ec519
--- /dev/null
+++ b/docker/neutron/neutron-agents/fwaas_driver.ini
@@ -0,0 +1 @@
+neutron-l3-agent/fwaas_driver.ini \ No newline at end of file
diff --git a/docker/neutron/neutron-agents/neutron-dhcp-agent/config-external.sh b/docker/neutron/neutron-agents/neutron-dhcp-agent/config-external.sh
new file mode 100755
index 000000000..badbd86a1
--- /dev/null
+++ b/docker/neutron/neutron-agents/neutron-dhcp-agent/config-external.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+SOURCES="/opt/kolla/neutron-agents/neutron.conf /opt/kolla/neutron-agents/dhcp_agent.ini /opt/kolla/neutron-agents/dnsmasq.conf"
+TARGET="/etc/neutron/"
+OWNER="neutron"
+
+for f in $SOURCES; do
+ if [[ -f "$f" ]]; then
+ fname=$(basename $f)
+ cp $f $TARGET
+ chown ${OWNER}: $TARGET/$fname
+ chmod 0644 $TARGET/$fname
+ fi
+done
diff --git a/docker/neutron/neutron-agents/neutron-dhcp-agent/start.sh b/docker/neutron/neutron-agents/neutron-dhcp-agent/start.sh
new file mode 100755
index 000000000..7b64f87aa
--- /dev/null
+++ b/docker/neutron/neutron-agents/neutron-dhcp-agent/start.sh
@@ -0,0 +1,37 @@
+#!/bin/bash
+set -o errexit
+
+CMD="/usr/bin/neutron-dhcp-agent"
+ARGS="--config-file /etc/neutron/neutron.conf --config-file /etc/neutron/dhcp_agent.ini"
+
+# Loading common functions.
+source /opt/kolla/kolla-common.sh
+source /opt/kolla/config-sudoers.sh
+
+# Override set_configs() here because it doesn't work for fat containers like
+# this one.
+set_configs() {
+ case $KOLLA_CONFIG_STRATEGY in
+ CONFIG_EXTERNAL_COPY_ALWAYS)
+ source /opt/kolla/neutron-dhcp-agent/config-external.sh
+ ;;
+ CONFIG_EXTERNAL_COPY_ONCE)
+ if [[ -f /configured-dhcp ]]; then
+ echo 'INFO - Neutron-dhcp has already been configured; Refusing to copy new configs'
+ return
+ fi
+ source /opt/kolla/neutron-dhcp-agent/config-external.sh
+ touch /configured-dhcp
+ ;;
+
+ *)
+ echo '$KOLLA_CONFIG_STRATEGY is not set properly'
+ exit 1
+ ;;
+ esac
+}
+
+# Execute config strategy
+set_configs
+
+exec $CMD $ARGS
diff --git a/docker/neutron/neutron-agents/neutron-l3-agent/config-external.sh b/docker/neutron/neutron-agents/neutron-l3-agent/config-external.sh
new file mode 100755
index 000000000..e6eb049a4
--- /dev/null
+++ b/docker/neutron/neutron-agents/neutron-l3-agent/config-external.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+SOURCES="/opt/kolla/neutron-agents/neutron.conf /opt/kolla/neutron-agents/l3_agent.ini /opt/kolla/neutron-agents/fwaas_driver.ini"
+TARGET="/etc/neutron/"
+OWNER="neutron"
+
+for f in $SOURCES; do
+ if [[ -f "$f" ]]; then
+ fname=$(basename $f)
+ cp $f $TARGET
+ chown ${OWNER}: $TARGET/$fname
+ chmod 0644 $TARGET/$fname
+ fi
+done
+
+SOURCE="/opt/kolla/neutron-agents/ml2_conf.ini"
+TARGET="/etc/neutron/plugins/ml2/ml2_conf.ini"
+OWNER="neutron"
+
+if [[ -f "$SOURCE" ]]; then
+ cp $SOURCE $TARGET
+ chown ${OWNER}: $TARGET
+ chmod 0644 $TARGET
+fi
diff --git a/docker/neutron/neutron-agents/neutron-l3-agent/fwaas_driver.ini b/docker/neutron/neutron-agents/neutron-l3-agent/fwaas_driver.ini
new file mode 100644
index 000000000..41f761abf
--- /dev/null
+++ b/docker/neutron/neutron-agents/neutron-l3-agent/fwaas_driver.ini
@@ -0,0 +1,3 @@
+[fwaas]
+#driver = neutron.services.firewall.drivers.linux.iptables_fwaas.IptablesFwaasDriver
+#enabled = True
diff --git a/docker/neutron/neutron-agents/neutron-l3-agent/start.sh b/docker/neutron/neutron-agents/neutron-l3-agent/start.sh
new file mode 100755
index 000000000..e0a17e47a
--- /dev/null
+++ b/docker/neutron/neutron-agents/neutron-l3-agent/start.sh
@@ -0,0 +1,37 @@
+#!/bin/bash
+set -o errexit
+
+CMD="/usr/bin/neutron-l3-agent"
+ARGS="--config-file /etc/neutron/neutron.conf --config-file /etc/neutron/l3_agent.ini --config-file /etc/neutron/fwaas_driver.ini --config-file /etc/neutron/plugins/ml2/ml2_conf.ini"
+
+# Loading common functions.
+source /opt/kolla/kolla-common.sh
+source /opt/kolla/config-sudoers.sh
+
+# Override set_configs() here because it doesn't work for fat containers like
+# this one.
+set_configs() {
+ case $KOLLA_CONFIG_STRATEGY in
+ CONFIG_EXTERNAL_COPY_ALWAYS)
+ source /opt/kolla/neutron-l3-agent/config-external.sh
+ ;;
+ CONFIG_EXTERNAL_COPY_ONCE)
+ if [[ -f /configured-l3 ]]; then
+ echo 'INFO - Neutron-l3 has already been configured; Refusing to copy new configs'
+ return
+ fi
+ source /opt/kolla/neutron-l3-agent/config-external.sh
+ touch /configured-l3
+ ;;
+
+ *)
+ echo '$KOLLA_CONFIG_STRATEGY is not set properly'
+ exit 1
+ ;;
+ esac
+}
+
+# Execute config strategy
+set_configs
+
+exec $CMD $ARGS
diff --git a/docker/neutron/neutron-agents/neutron-metadata-agent/config-external.sh b/docker/neutron/neutron-agents/neutron-metadata-agent/config-external.sh
new file mode 100755
index 000000000..319ee3793
--- /dev/null
+++ b/docker/neutron/neutron-agents/neutron-metadata-agent/config-external.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+SOURCES="/opt/kolla/neutron-agents/neutron.conf /opt/kolla/neutron-agents/metadata_agent.ini"
+TARGET="/etc/neutron/"
+OWNER="neutron"
+
+for f in $SOURCES; do
+ if [[ -f "$f" ]]; then
+ fname=$(basename $f)
+ cp $f $TARGET
+ chown ${OWNER}: $TARGET/$fname
+ chmod 0644 $TARGET/$fname
+ fi
+done
diff --git a/docker/neutron/neutron-agents/neutron-metadata-agent/start.sh b/docker/neutron/neutron-agents/neutron-metadata-agent/start.sh
new file mode 100755
index 000000000..09a7329c7
--- /dev/null
+++ b/docker/neutron/neutron-agents/neutron-metadata-agent/start.sh
@@ -0,0 +1,37 @@
+#!/bin/bash
+set -o errexit
+
+CMD="/usr/bin/neutron-metadata-agent"
+ARGS="--config-file /etc/neutron/neutron.conf --config-file /etc/neutron/metadata_agent.ini"
+
+# Loading common functions.
+source /opt/kolla/kolla-common.sh
+source /opt/kolla/config-sudoers.sh
+
+# Override set_configs() here because it doesn't work for fat containers like
+# this one.
+set_configs() {
+ case $KOLLA_CONFIG_STRATEGY in
+ CONFIG_EXTERNAL_COPY_ALWAYS)
+ source /opt/kolla/neutron-metadata-agent/config-external.sh
+ ;;
+ CONFIG_EXTERNAL_COPY_ONCE)
+ if [[ -f /configured-md ]]; then
+ echo 'INFO - Neutron-metadata has already been configured; Refusing to copy new configs'
+ return
+ fi
+ source /opt/kolla/neutron-metadata-agent/config-external.sh
+ touch /configured-md
+ ;;
+
+ *)
+ echo '$KOLLA_CONFIG_STRATEGY is not set properly'
+ exit 1
+ ;;
+ esac
+}
+
+# Execute config strategy
+set_configs
+
+exec $CMD $ARGS
diff --git a/docker/neutron/neutron-agents/supervisord.conf b/docker/neutron/neutron-agents/supervisord.conf
new file mode 100644
index 000000000..5cab8f5dc
--- /dev/null
+++ b/docker/neutron/neutron-agents/supervisord.conf
@@ -0,0 +1,40 @@
+[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-dhcp-agent]
+command=/opt/kolla/neutron-dhcp-agent/start.sh
+priority=40
+startsec=10
+stderr_events_enabled=true
+stdout_events_enabled=true
+
+[program:neutron-metadata-agent]
+command=/opt/kolla/neutron-metadata-agent/start.sh
+priority=40
+startsec=10
+stderr_events_enabled=true
+stdout_events_enabled=true
+
+[program:neutron-l3-agent]
+command=/opt/kolla/neutron-l3-agent/start.sh
+priority=40
+startsec=10
+stderr_events_enabled=true
+stdout_events_enabled=true
diff --git a/docker/neutron/neutron-base/Dockerfile.j2 b/docker/neutron/neutron-base/Dockerfile.j2
new file mode 100644
index 000000000..f1cd75a37
--- /dev/null
+++ b/docker/neutron/neutron-base/Dockerfile.j2
@@ -0,0 +1,47 @@
+FROM {{ namespace }}/{{ base_distro }}-{{ install_type }}-base:{{ tag }}
+MAINTAINER Kolla Project (https://launchpad.net.kolla)
+
+{% if install_type == 'binary' %}
+ {% if base_distro in ['centos', 'fedora', 'oraclelinux'] %}
+
+RUN yum -y install openstack-neutron \
+ openstack-neutron-ml2 \
+ openvswitch \
+ && yum clean all
+
+# TODO (sdake): remove once RDO adds to the openstack-neutron package
+RUN pip install oslo.versionedobjects
+
+ {% elif base_distro in ['ubuntu', 'debian'] %}
+
+RUN echo '{{ install_type}} not yet available for {{ base_distro }}' \
+ && /bin/false
+
+ {% endif %}
+{% elif install_type == 'source' %}
+ {% if base_distro in ['ubuntu', 'debian'] %}
+
+RUN apt-get install -y --no-install-recommends \
+ iptables \
+ dnsmasq \
+ uuid-runtime \
+ ipset \
+ openvswitch-switch \
+ && apt-get clean
+
+ {% endif %}
+
+ADD neutron.tar /
+RUN ln -s /neutron-* neutron \
+ && useradd --user-group neutron \
+ && pip --no-cache-dir install /neutron \
+ && mkdir -p /etc/neutron /usr/share/neutron /var/log/neutron /home/neutron \
+ && cp -r /neutron/etc/* /etc/neutron/ \
+ && cp -r /neutron/etc/neutron/* /etc/neutron/ \
+ && cp /neutron/etc/api-paste.ini /usr/share/neutron \
+ && mv /etc/neutron/neutron/ /etc/neutron/plugins/ \
+ && chown -R neutron: /etc/neutron /usr/share/neutron /var/log/neutron /home/neutron
+
+{% endif %}
+
+COPY config-sudoers.sh /opt/kolla/
diff --git a/docker/neutron/neutron-base/config-sudoers.sh b/docker/neutron/neutron-base/config-sudoers.sh
new file mode 100644
index 000000000..82cf0d624
--- /dev/null
+++ b/docker/neutron/neutron-base/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 /sudo-modified ]; then
+ chmod 0640 /etc/sudoers
+ sed -i '/Defaults requiretty/s/^/#/' /etc/sudoers
+ chmod 0440 /etc/sudoers
+fi
+
+touch /sudo-modified
diff --git a/docker/neutron/neutron-base/ip_wrapper.py b/docker/neutron/neutron-base/ip_wrapper.py
new file mode 100755
index 000000000..591fca6f4
--- /dev/null
+++ b/docker/neutron/neutron-base/ip_wrapper.py
@@ -0,0 +1,66 @@
+#!/usr/bin/env python
+
+# Copyright 2015 Sam Yaple
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# This file exists because we want to create and delete any network
+# namespaces from the host mount namespace. This allows the host to
+# access all of the neutron network namespaces as well as all
+# containers that bind mount /run/netns from the host.
+
+# This is required for "thin" neutron containers to function properly
+
+import nsenter
+import subprocess
+import sys
+
+
+def host_mnt_exec(cmd):
+ try:
+ with nsenter.ExitStack() as stack:
+ stack.enter_context(
+ nsenter.Namespace(
+ '1',
+ 'mnt',
+ proc='/opt/kolla/host_proc/'))
+ process_ = subprocess.Popen(cmd)
+
+ except Exception as e:
+ print(
+ "An error has occured with a component that Kolla manages."
+ " Please file a bug")
+ print("Error: ", e)
+
+ return process_
+
+
+if len(sys.argv) > 2:
+ # We catch all commands that ip will accept that refer
+ # to creating or deleteing a Network namespace
+ if str(sys.argv[1]).startswith("net") and (
+ str(sys.argv[2]).startswith("a") or
+ str(sys.argv[2]).startswith("d")):
+ # This cmd is executed in the host mount namespace
+ cmd = ["/usr/bin/env", "ip"] + sys.argv[1:]
+ sys.exit(host_mnt_exec(cmd).returncode)
+ else:
+ cmd = ["/opt/kolla/ip"] + sys.argv[1:]
+else:
+ cmd = ["/opt/kolla/ip"]
+
+ if len(sys.argv) == 2:
+ cmd = cmd + sys.argv[1:]
+
+process_ = subprocess.Popen(cmd)
+sys.exit(process_.returncode)
diff --git a/docker/neutron/neutron-linuxbridge-agent/Dockerfile.j2 b/docker/neutron/neutron-linuxbridge-agent/Dockerfile.j2
new file mode 100644
index 000000000..58d5ae6c3
--- /dev/null
+++ b/docker/neutron/neutron-linuxbridge-agent/Dockerfile.j2
@@ -0,0 +1,28 @@
+FROM {{ namespace }}/{{ base_distro }}-{{ install_type }}-neutron-base:{{ tag }}
+MAINTAINER Kolla Project (https://launchpad.net.kolla)
+
+{% if install_type == 'binary' %}
+ {% if base_distro in ['centos', 'fedora', 'oraclelinux'] %}
+
+# Install required packages
+RUN yum install -y \
+ ebtables \
+ openstack-neutron-linuxbridge \
+ && yum clean all
+
+ {% endif %}
+{% elif install_type == 'source' %}
+ {% if base_distro in ['centos', 'fedora', 'oraclelinux'] %}
+
+# Install required packages
+RUN yum install -y ebtables && yum clean all
+
+ {% endif %}
+{% endif %}
+
+COPY start.sh /
+COPY config-external.sh /opt/kolla/
+
+CMD ["/start.sh"]
+
+{{ include_footer }}
diff --git a/docker/neutron/neutron-linuxbridge-agent/config-external.sh b/docker/neutron/neutron-linuxbridge-agent/config-external.sh
new file mode 100755
index 000000000..c44d71d84
--- /dev/null
+++ b/docker/neutron/neutron-linuxbridge-agent/config-external.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+SOURCE="/opt/kolla/neutron-linuxbridge-agent/neutron.conf"
+TARGET="/etc/neutron/neutron.conf"
+OWNER="neutron"
+
+if [[ -f "$SOURCE" ]]; then
+ cp $SOURCE $TARGET
+ chown ${OWNER}: $TARGET
+ chmod 0644 $TARGET
+fi
+
+SOURCE="/opt/kolla/neutron-linuxbridge-agent/ml2_conf.ini"
+TARGET="/etc/neutron/plugins/ml2/ml2_conf.ini"
+OWNER="neutron"
+
+if [[ -f "$SOURCE" ]]; then
+ cp $SOURCE $TARGET
+ chown ${OWNER}: $TARGET
+ chmod 0644 $TARGET
+fi
diff --git a/docker/neutron/neutron-linuxbridge-agent/start.sh b/docker/neutron/neutron-linuxbridge-agent/start.sh
new file mode 100755
index 000000000..ab47f2dfb
--- /dev/null
+++ b/docker/neutron/neutron-linuxbridge-agent/start.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+set -o errexit
+
+CMD="/usr/bin/neutron-linuxbridge-agent"
+ARGS="--config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini"
+
+# Loading common functions.
+source /opt/kolla/kolla-common.sh
+source /opt/kolla/config-sudoers.sh
+
+# Execute config strategy
+set_configs
+
+exec $CMD $ARGS
diff --git a/docker/neutron/neutron-openvswitch-agent/Dockerfile.j2 b/docker/neutron/neutron-openvswitch-agent/Dockerfile.j2
new file mode 100644
index 000000000..ad12e5511
--- /dev/null
+++ b/docker/neutron/neutron-openvswitch-agent/Dockerfile.j2
@@ -0,0 +1,32 @@
+FROM {{ namespace }}/{{ base_distro }}-{{ install_type }}-neutron-base:{{ tag }}
+MAINTAINER Kolla Project (https://launchpad.net.kolla)
+
+{% if install_type == 'binary' %}
+ {% if base_distro in ['centos', 'fedora', 'oraclelinux'] %}
+
+# Install required packages
+RUN yum install -y \
+ openstack-neutron-openvswitch \
+ openvswitch \
+ && yum clean all
+
+ {% endif %}
+{% elif install_type == 'source' %}
+ {% if base_distro in ['centos', 'fedora', 'oraclelinux'] %}
+
+# Install required packages
+RUN yum install -y \
+ #TODO: will be addressed later
+ https://rdoproject.org/repos/openstack-kilo/rdo-release-kilo.rpm \
+ openvswitch \
+ && yum clean all
+
+ {% endif %}
+{% endif %}
+
+COPY start.sh /
+COPY config-external.sh /opt/kolla/
+
+CMD ["/start.sh"]
+
+{{ include_footer }}
diff --git a/docker/neutron/neutron-openvswitch-agent/config-external.sh b/docker/neutron/neutron-openvswitch-agent/config-external.sh
new file mode 100755
index 000000000..552d69861
--- /dev/null
+++ b/docker/neutron/neutron-openvswitch-agent/config-external.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+SOURCE="/opt/kolla/neutron-openvswitch-agent/neutron.conf"
+TARGET="/etc/neutron/neutron.conf"
+OWNER="neutron"
+
+if [[ -f "$SOURCE" ]]; then
+ cp $SOURCE $TARGET
+ chown ${OWNER}: $TARGET
+ chmod 0644 $TARGET
+fi
+
+SOURCE="/opt/kolla/neutron-openvswitch-agent/ml2_conf.ini"
+TARGET="/etc/neutron/plugins/ml2/ml2_conf.ini"
+OWNER="neutron"
+
+if [[ -f "$SOURCE" ]]; then
+ cp $SOURCE $TARGET
+ chown ${OWNER}: $TARGET
+ chmod 0644 $TARGET
+fi
diff --git a/docker/neutron/neutron-openvswitch-agent/start.sh b/docker/neutron/neutron-openvswitch-agent/start.sh
new file mode 100755
index 000000000..6d62ff65d
--- /dev/null
+++ b/docker/neutron/neutron-openvswitch-agent/start.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+set -o errexit
+
+CMD="/usr/bin/neutron-openvswitch-agent"
+ARGS="--config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini"
+
+# Loading common functions.
+source /opt/kolla/kolla-common.sh
+source /opt/kolla/config-sudoers.sh
+
+# Execute config strategy
+set_configs
+
+exec $CMD $ARGS
diff --git a/docker/neutron/neutron-server/Dockerfile.j2 b/docker/neutron/neutron-server/Dockerfile.j2
new file mode 100644
index 000000000..9cfe634c4
--- /dev/null
+++ b/docker/neutron/neutron-server/Dockerfile.j2
@@ -0,0 +1,31 @@
+FROM {{ namespace }}/{{ base_distro }}-{{ install_type }}-neutron-base:{{ tag }}
+MAINTAINER Kolla Project (https://launchpad.net.kolla)
+
+{% if install_type == 'binary' %}
+ {% if base_distro in ['centos', 'fedora', 'oraclelinux'] %}
+
+# Install required packages
+RUN yum install -y which \
+ && yum clean all
+
+# See bug: https://bugs.launchpad.net/kolla/+bug/1483667
+# TODO(SamYaple): Check in on this and remove once unneccesary
+RUN pip install oslo.messaging==2.2.0
+
+ {% endif %}
+{% elif install_type == 'source' %}
+ {% if base_distro in ['centos', 'fedora', 'oraclelinux'] %}
+
+#Install required packages
+RUN yum install -y which \
+ && yum clean all
+
+ {% endif %}
+{% endif %}
+
+COPY start.sh /
+COPY config-external.sh /opt/kolla/
+
+CMD ["/start.sh"]
+
+{{ include_footer }}
diff --git a/docker/neutron/neutron-server/config-external.sh b/docker/neutron/neutron-server/config-external.sh
new file mode 100755
index 000000000..574923067
--- /dev/null
+++ b/docker/neutron/neutron-server/config-external.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+SOURCE="/opt/kolla/neutron-server/neutron.conf"
+TARGET="/etc/neutron/neutron.conf"
+OWNER="neutron"
+
+if [[ -f "$SOURCE" ]]; then
+ cp $SOURCE $TARGET
+ chown ${OWNER}: $TARGET
+ chmod 0644 $TARGET
+fi
+
+SOURCE="/opt/kolla/neutron-server/ml2_conf.ini"
+TARGET="/etc/neutron/plugins/ml2/ml2_conf.ini"
+OWNER="neutron"
+
+if [[ -f "$SOURCE" ]]; then
+ cp $SOURCE $TARGET
+ chown ${OWNER}: $TARGET
+ chmod 0644 $TARGET
+fi
diff --git a/docker/neutron/neutron-server/start.sh b/docker/neutron/neutron-server/start.sh
new file mode 100755
index 000000000..51c4c2a3d
--- /dev/null
+++ b/docker/neutron/neutron-server/start.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+set -o errexit
+
+CMD="/usr/bin/neutron-server"
+ARGS="--config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini"
+
+# Loading common functions.
+source /opt/kolla/kolla-common.sh
+
+# Execute config strategy
+set_configs
+
+# Bootstrap and exit if KOLLA_BOOTSTRAP variable is set. This catches all cases
+# of the KOLLA_BOOTSTRAP variable being set, including empty.
+if [[ "${!KOLLA_BOOTSTRAP[@]}" ]]; then
+ 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
+ exit 0
+fi
+
+exec $CMD $ARGS