From de313681f94a75b3dbcb078fa023495e2c04617f Mon Sep 17 00:00:00 2001
From: Daneyon Hansen <danehans@cisco.com>
Date: Mon, 13 Oct 2014 16:36:17 +0000
Subject: [PATCH] Adds Neutron Server Support

Previously Kolla did not support Neutron. This patch provides
initial Neutron support by implementing neutron-server
functionality. It also creates a neutron-base image that
provides common config and packages for all Neutron-based
services.

Partially Implements: Blueprint Kubernetes Neutron Container

Change-Id: I2399a1331992fae0f387f01e5b5c1c1d34f0637d
---
 docker/neutron/neutron-base/Dockerfile        |   8 ++
 docker/neutron/neutron-base/build             |   1 +
 docker/neutron/neutron-base/config-neutron.sh |  87 +++++++++++++++
 docker/neutron/neutron-server/Dockerfile      |  17 +++
 docker/neutron/neutron-server/build           |   1 +
 docker/neutron/neutron-server/check.sh        |  17 +++
 docker/neutron/neutron-server/start.sh        | 104 ++++++++++++++++++
 k8s/pod/neutron-controller-pod.yaml           |  30 +++++
 k8s/service/neutron-server-service.yaml       |   7 ++
 tools/start-all-pods                          |   1 +
 tools/start-all-services                      |   1 +
 11 files changed, 274 insertions(+)
 create mode 100644 docker/neutron/neutron-base/Dockerfile
 create mode 120000 docker/neutron/neutron-base/build
 create mode 100644 docker/neutron/neutron-base/config-neutron.sh
 create mode 100644 docker/neutron/neutron-server/Dockerfile
 create mode 120000 docker/neutron/neutron-server/build
 create mode 100755 docker/neutron/neutron-server/check.sh
 create mode 100755 docker/neutron/neutron-server/start.sh
 create mode 100644 k8s/pod/neutron-controller-pod.yaml
 create mode 100644 k8s/service/neutron-server-service.yaml

diff --git a/docker/neutron/neutron-base/Dockerfile b/docker/neutron/neutron-base/Dockerfile
new file mode 100644
index 0000000000..ab8890326b
--- /dev/null
+++ b/docker/neutron/neutron-base/Dockerfile
@@ -0,0 +1,8 @@
+FROM kollaglue/fedora-rdo-base
+MAINTAINER Daneyon Hansen <danehans@cisco.com>
+
+RUN yum -y install openstack-neutron-ml2 ; yum clean all
+
+RUN mkdir -p /opt/kolla
+COPY config-neutron.sh /opt/kolla/config-neutron.sh
+
diff --git a/docker/neutron/neutron-base/build b/docker/neutron/neutron-base/build
new file mode 120000
index 0000000000..43944faa00
--- /dev/null
+++ b/docker/neutron/neutron-base/build
@@ -0,0 +1 @@
+../../../tools/build-docker-image
\ No newline at end of file
diff --git a/docker/neutron/neutron-base/config-neutron.sh b/docker/neutron/neutron-base/config-neutron.sh
new file mode 100644
index 0000000000..1b60709af5
--- /dev/null
+++ b/docker/neutron/neutron-base/config-neutron.sh
@@ -0,0 +1,87 @@
+#!/bin/sh
+
+set -e
+
+. /opt/kolla/kolla-common.sh
+
+: ${ADMIN_TENANT_NAME:=admin}
+: ${NEUTRON_DB_NAME:=neutron}
+: ${NEUTRON_DB_USER:=neutron}
+: ${NEUTRON_KEYSTONE_USER:=neutron}
+: ${KEYSTONE_AUTH_PROTOCOL:=http}
+: ${RABBIT_HOST:=$RABBITMQ_SERVICE_HOST}
+: ${RABBIT_USER:=guest}
+: ${RABBIT_PASSWORD:=guest}
+
+check_required_vars NEUTRON_KEYSTONE_PASSWORD
+dump_vars
+
+cat > /openrc <<EOF
+export OS_AUTH_URL="http://${KEYSTONE_PUBLIC_SERVICE_HOST}:5000/v2.0"
+export OS_USERNAME="${NEUTRON_KEYSTONE_USER}"
+export OS_PASSWORD="${NEUTRON_KEYSTONE_PASSWORD}"
+export OS_TENANT_NAME="${ADMIN_TENANT_NAME}"
+EOF
+
+# Rabbit
+crudini --set /etc/neutron/neutron.conf \
+        DEFAULT \
+        rabbit_host \
+        "${RABBIT_HOST}"
+crudini --set /etc/neutron/neutron.conf \
+        DEFAULT \
+        rabbit_userid \
+        "${RABBIT_USER}"
+crudini --set /etc/neutron/neutron.conf \
+        DEFAULT \
+        rabbit_password \
+        "${RABBIT_PASSWORD}"
+
+# Keystone
+crudini --set /etc/neutron/neutron.conf \
+        DEFAULT \
+        auth_strategy \
+        "keystone"
+crudini --set /etc/neutron/neutron.conf \
+        keystone_authtoken \
+        auth_protocol \
+        "${KEYSTONE_AUTH_PROTOCOL}"
+crudini --set /etc/neutron/neutron.conf \
+        keystone_authtoken \
+        auth_host \
+        "${KEYSTONE_ADMIN_SERVICE_HOST}"
+crudini --set /etc/neutron/neutron.conf \
+        keystone_authtoken \
+        auth_port \
+        "${KEYSTONE_ADMIN_SERVICE_PORT}"
+crudini --set /etc/neutron/neutron.conf \
+        keystone_authtoken \
+        auth_uri \
+        "${KEYSTONE_AUTH_PROTOCOL}://${KEYSTONE_PUBLIC_SERVICE_HOST}:5000/"
+crudini --set /etc/neutron/neutron.conf \
+        keystone_authtoken \
+        admin_tenant_name \
+        "${ADMIN_TENANT_NAME}"
+crudini --set /etc/neutron/neutron.conf \
+        keystone_authtoken \
+        admin_user \
+        "${NEUTRON_KEYSTONE_USER}"
+crudini --set /etc/neutron/neutron.conf \
+        keystone_authtoken \
+        admin_password \
+        "${NEUTRON_KEYSTONE_PASSWORD}"
+
+# ML2
+crudini --set /etc/neutron/neutron.conf \
+        DEFAULT \
+        core_plugin \
+        "ml2"
+crudini --set /etc/neutron/neutron.conf \
+        DEFAULT \
+        service_plugins \
+        "router"
+crudini --set /etc/neutron/neutron.conf \
+        DEFAULT \
+        allow_overlapping_ips \
+        "True"
+
diff --git a/docker/neutron/neutron-server/Dockerfile b/docker/neutron/neutron-server/Dockerfile
new file mode 100644
index 0000000000..5004c23477
--- /dev/null
+++ b/docker/neutron/neutron-server/Dockerfile
@@ -0,0 +1,17 @@
+FROM kollaglue/fedora-rdo-neutron-base
+MAINTAINER Daneyon Hansen <danehans@cisco.com>
+
+#Install required packages
+RUN yum install -y openstack-neutron \
+        python-neutronclient \
+        mariadb \
+        ; yum clean all
+
+VOLUME /var/lib/neutron
+
+EXPOSE 9696
+
+ADD ./start.sh /start.sh
+ADD ./check.sh /check.sh
+
+CMD ["/start.sh"]
diff --git a/docker/neutron/neutron-server/build b/docker/neutron/neutron-server/build
new file mode 120000
index 0000000000..43944faa00
--- /dev/null
+++ b/docker/neutron/neutron-server/build
@@ -0,0 +1 @@
+../../../tools/build-docker-image
\ No newline at end of file
diff --git a/docker/neutron/neutron-server/check.sh b/docker/neutron/neutron-server/check.sh
new file mode 100755
index 0000000000..2a44cda912
--- /dev/null
+++ b/docker/neutron/neutron-server/check.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+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/neutron/neutron-server/start.sh b/docker/neutron/neutron-server/start.sh
new file mode 100755
index 0000000000..92ab935c53
--- /dev/null
+++ b/docker/neutron/neutron-server/start.sh
@@ -0,0 +1,104 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/kolla-common.sh
+. /opt/kolla/config-neutron.sh
+
+check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
+                    NEUTRON_KEYSTONE_USER NEUTRON_KEYSTONE_PASSWORD \
+                    ADMIN_TENANT_NAME NEUTRON_SERVER_SERVICE_HOST \
+                    PUBLIC_IP
+check_for_keystone
+check_for_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}:35357/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}:9696" \
+    -P "${KEYSTONE_AUTH_PROTOCOL}://${PUBLIC_IP}:9696" \
+    -A "${KEYSTONE_AUTH_PROTOCOL}://${NEUTRON_SERVER_SERVICE_HOST}:9696"
+
+# Database
+crudini --set /etc/neutron/neutron.conf \
+        database \
+        connection \
+        "mysql://${NEUTRON_DB_USER}:${NEUTRON_DB_PASSWORD}@${MARIADB_SERVICE_HOST}/${NEUTRON_DB_NAME}"
+
+# Nova
+crudini --set /etc/neutron/neutron.conf \
+        DEFAULT \
+        notify_nova_on_port_status_changes \
+        "True"
+crudini --set /etc/neutron/neutron.conf \
+        DEFAULT \
+        notify_nova_on_port_data_changes \
+        "True"
+crudini --set /etc/neutron/neutron.conf \
+        DEFAULT \
+        nova_url \
+        "http://${NOVA_API_SERVICE_HOST}:8774/v2"
+crudini --set /etc/neutron/neutron.conf \
+        DEFAULT \
+        nova_admin_auth_url \
+        "http://${KEYSTONE_ADMIN_SERVICE_HOST}:35357/v2.0"
+crudini --set /etc/neutron/neutron.conf \
+        DEFAULT \
+        nova_region_name \
+        "RegionOne"
+crudini --set /etc/neutron/neutron.conf \
+        DEFAULT \
+        nova_admin_username \
+        "nova"
+crudini --set /etc/neutron/neutron.conf \
+        DEFAULT \
+        nova_admin_tenant_id \
+        "$(keystone tenant-list | grep $ADMIN_TENANT_NAME | awk '{print $2;}')"
+crudini --set /etc/neutron/neutron.conf \
+        DEFAULT \
+        nova_admin_password \
+        "${NOVA_ADMIN_PASSWORD}"
+
+# Configure ml2_conf.ini
+crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini \
+        ml2 \
+        type_drivers \
+        "gre"
+crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini \
+        ml2 \
+        tenant_network_types \
+        "gre"
+crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini \
+        ml2 \
+        mechanism_drivers \
+        "openvswitch"
+crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini \
+        ml2_type_gre \
+        tunnel_id_ranges \
+        "1:1000"
+crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini \
+        securitygroup \
+        firewall_driver \
+        "neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver"
+crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini \
+        securitygroup \
+        enable_security_group \
+        "True"
+
+/usr/bin/ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini
+
+exec /usr/bin/neutron-server
diff --git a/k8s/pod/neutron-controller-pod.yaml b/k8s/pod/neutron-controller-pod.yaml
new file mode 100644
index 0000000000..a3262a3659
--- /dev/null
+++ b/k8s/pod/neutron-controller-pod.yaml
@@ -0,0 +1,30 @@
+desiredState:
+  manifest:
+    volumes:
+      - name: neutron-data
+        source:
+          emptyDir: {}
+    containers:
+      env:
+        - name: DB_ROOT_PASSWORD
+          value: password
+        - name: NEUTRON_DB_PASSWORD
+          value: password
+        - name: NEUTRON_KEYSTONE_PASSWORD
+          value: password
+        - name: KEYSTONE_ADMIN_TOKEN
+          value: ADMINTOKEN
+        - name: NOVA_ADMIN_PASSWORD
+          value: kolla
+      image: danehans/fedora-rdo-neutron-server
+      name: neutron-server
+      ports:
+        - containerPort: 9696
+      volumeMounts:
+        - name: neutron-data
+          mountPath: /var/lib/neutron
+    id: neutron-controller-1
+    version: v1beta1
+id: neutron-controller
+labels:
+  name: neutron
diff --git a/k8s/service/neutron-server-service.yaml b/k8s/service/neutron-server-service.yaml
new file mode 100644
index 0000000000..148ea4da26
--- /dev/null
+++ b/k8s/service/neutron-server-service.yaml
@@ -0,0 +1,7 @@
+id: neutron-server
+kind: Service
+apiVersion: v1beta1
+port: 9696
+containerPort: 9696
+selector:
+  name: neutron-server
diff --git a/tools/start-all-pods b/tools/start-all-pods
index df7d5ec6aa..c73ab979d0 100755
--- a/tools/start-all-pods
+++ b/tools/start-all-pods
@@ -8,6 +8,7 @@ mariadb
 keystone
 glance
 nova-controller
+neutron-controller
 '
 
 for pod in $pods; do
diff --git a/tools/start-all-services b/tools/start-all-services
index 519741559d..dbfe5d8e85 100755
--- a/tools/start-all-services
+++ b/tools/start-all-services
@@ -13,6 +13,7 @@ nova-ec2-api
 nova-libvirt
 nova-metadata-api
 rabbitmq
+neutron-server
 '
 
 for svc in $services; do