diff options
| author | Brian Haley <bhaley@redhat.com> | 2020-02-03 19:10:24 -0500 |
|---|---|---|
| committer | Brian Haley <bhaley@redhat.com> | 2020-02-18 17:26:15 -0500 |
| commit | 88a6c92dc7523f9069388b7df02519988bab0b97 (patch) | |
| tree | f2fa2ce7d8e0c42be7dba4b406d50d4b63f7af48 /vagrant | |
| parent | e9acdb06fa1ad2095cfd1665f7662c5982552223 (diff) | |
| download | neutron-88a6c92dc7523f9069388b7df02519988bab0b97.tar.gz | |
[OVN] Merge networking-ovn vagrant into neutron
Move networking-ovn/vagrant into neutron/tools/ovn_vagrant
Also added two sample local.conf files for a DB-only and
VTEP nodes.
Co-Authored-By: zhangyanxian <zhangyanxianmail@163.com>
Co-Authored-By: chen-li <shchenli@cn.ibm.com>
Co-Authored-By: Russell Bryant <rbryant@redhat.com>
Co-Authored-By: Kyle Mestery <mestery@mestery.com
Co-Authored-By: Miguel Angel Ajo <majopela@redhat.com>
Co-Authored-By: Richard Theis <rtheis@us.ibm.com>
Co-Authored-By: JUNJIE NAN <nanjj@cn.ibm.com>
Co-Authored-By: Flavio Fernandes <flavio@flaviof.com>
Co-Authored-By: John Kasperski <jckasper@us.ibm.com>
Co-Authored-By: Matthew Kassawara <mkassawara@gmail.com>
Co-Authored-By: venkatamahesh <venkatamaheshkotha@gmail.com>
Co-Authored-By: Tong Li <litong01@us.ibm.com>
Co-Authored-By: venkata anil <anilvenkata@redhat.com>
Co-Authored-By: Vu Cong Tuan <tuanvc@vn.fujitsu.com>
Co-Authored-By: RYAN D. MOATS <rmoats@us.ibm.com>
Change-Id: I12966d5548a60b46edd5c84ee0035eb11671fd8c
Partially-Implements: blueprint neutron-ovn-merge
Diffstat (limited to 'vagrant')
| -rw-r--r-- | vagrant/ovn/README.rst | 6 | ||||
| -rw-r--r-- | vagrant/ovn/provisioning/boxes.yml | 6 | ||||
| -rw-r--r-- | vagrant/ovn/provisioning/id_rsa | 27 | ||||
| -rw-r--r-- | vagrant/ovn/provisioning/id_rsa.pub | 1 | ||||
| -rw-r--r-- | vagrant/ovn/provisioning/provider-setup.sh | 19 | ||||
| -rw-r--r-- | vagrant/ovn/provisioning/providers.rb | 42 | ||||
| -rw-r--r-- | vagrant/ovn/provisioning/setup-base.sh | 104 | ||||
| -rw-r--r-- | vagrant/ovn/provisioning/setup-compute.sh | 103 | ||||
| -rw-r--r-- | vagrant/ovn/provisioning/setup-controller.sh | 130 | ||||
| -rw-r--r-- | vagrant/ovn/provisioning/setup-db.sh | 29 | ||||
| -rw-r--r-- | vagrant/ovn/provisioning/setup-vtep.sh | 32 | ||||
| -rw-r--r-- | vagrant/ovn/sparse/README.rst | 9 | ||||
| -rw-r--r-- | vagrant/ovn/sparse/Vagrantfile | 96 | ||||
| -rw-r--r-- | vagrant/ovn/sparse/instances.yml | 46 |
14 files changed, 650 insertions, 0 deletions
diff --git a/vagrant/ovn/README.rst b/vagrant/ovn/README.rst new file mode 100644 index 0000000000..5d45a9b57a --- /dev/null +++ b/vagrant/ovn/README.rst @@ -0,0 +1,6 @@ +========================================= +Automatic deployment of OVN using Vagrant +========================================= + +Please reference the files in /doc/source/contributor/ovn_vagrant/ for more +information about this. diff --git a/vagrant/ovn/provisioning/boxes.yml b/vagrant/ovn/provisioning/boxes.yml new file mode 100644 index 0000000000..318786c4c2 --- /dev/null +++ b/vagrant/ovn/provisioning/boxes.yml @@ -0,0 +1,6 @@ +--- +ubuntu: + virtualbox: bento/ubuntu-18.04 + libvirt: elastic/ubuntu-18.04-x86_64 + parallels: bento/ubuntu-18.04 + openstack: bionic64 diff --git a/vagrant/ovn/provisioning/id_rsa b/vagrant/ovn/provisioning/id_rsa new file mode 100644 index 0000000000..0a60d102fe --- /dev/null +++ b/vagrant/ovn/provisioning/id_rsa @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAv2EyHk382N9LGMPAGbAG9rea6qcO+I+qj7OscU1k8GxnYO0B +hHYPMzfT1RgeBDelNyM22SNiySr4iTQDBQxgunrUCdTaNu5dmzYT68gieqnH+CRR +jpLxXecH2hcvKyFx5qmhMt4zE3QWCDv2JJiB5CGoV7sGCy1aTYbFJBeKwMUMpBwP +67rpBdVcpNjeSkw8FKDvPVx1p1O0YgeI9JoIL0qka6FFgiii/wf5jgr0w/JW15VI +2pYwpHhdnBt3M3BV2HK5cA6nwFhUfAG0HLP5lUGW9/Hk5ng/Wl7cz8nLAdgXf4Uc +IUffO5SH+9/H5VhTMDpaRPgxWuOw1/UGLgf57wIDAQABAoIBAD/+5X6Cv6lZycfn +NWahmUKJFRGgeX4etH9HKsPciINpDIy51EcSH3UWFwzr+qWYYfP1H5MupQr2BpQC +w3u9rt7M0fjTp4C05rJPPAwdKYJxIcBVjLwrYPDwn4yLMievEGJ8mL3k1ZmMuQ1Z +165XHSBHLP7hOF0mdkr0ZRnzkV9yMPjZAI6xnkt/q6EvO34wSZu3/qsmptipHgqB +QQAjPIvJwr7DMoLVpBjLlfGihUB5NAVC0RU+7SIiTAUg0atUzucp+sQMnWlWKVvM +3+nHGC8gR4fUy30LDgxd4eqFyG8EYpTzpN/0bgM3kdwiQTkR/lGvhwmok/o6Nz0n +67ve12ECgYEA41lug+TitPrq9VaLacTBpDOafsmIY30sylBJClcbkQ94NEQyNASg +TsXxRtvYvKuHy0i2xZwagqEyReaTfsScmyFOk/SRFqjgmb3eWYtgF04MtAAmLy9G +5UmPLEm6lLuQGCI7CqLAv3PFCR7W7dX5VYwkteDejZ0NlLeNqKJjIvECgYEA139W +ocUBbWu4ea68JB/qOGrxCMQKn6K3l9kA7tuu+3a0le0G7LF6dr+X1wvboCF/w8CZ +ZqKm35yZoAzyFmfn8oGtJdgbz4Sl3/vZReg86Ca//m4LMe1FkkimT3UW+BKprtEJ +5GiKKWYElknMthbDTpL5EouciPhG0bYKuIMBKt8CgYAL+LqcEWJqu0fCEYOX1zeH +KPx6rqwS6RWBtcaS19FoyxK+VdT67j9uxneVDqCUFsg4ySRutXCj7k8SZTjhFQNW +G+PiYJ9/PPdOwTPDLVarA34hwFxCYc/u5Pe4Ek3T5SiKTMslHTrfGf6HI2uX7IuL +mKyaMzQk6t87NIsuFRb5UQKBgQCzciEEslUe9b127k9S0ZSriDnQb9bc2ZWCB7zk +KeELGu0Dj43dmWh968sX0pL/RAXtTrsuoTDOMcwnX8BTchDOerdhNRTrd+zcmA50 +TRAyzNnBl4cQ+yCc0IxUzA7lYj0UCpPvNDIgiQg20Zt64XefPXnUvJcL45qtVKaW +wNg/BwKBgFyhjxftMwAJJF2Hcq5s8QvNhznBgLtne7jnQkHU4qcJx6tcR1hy0Jqe +8/zkr5+41EaFU2jjGn8cnUrlS/Vc/HZg3rmHYycX5wg9hrg1j4hokSHjsGL6Y7yn +8oXIWJSqpxuMjfRh1Tb81Fg05emrMjTy6aLuGS0siUlTPzflD0RI +-----END RSA PRIVATE KEY-----
\ No newline at end of file diff --git a/vagrant/ovn/provisioning/id_rsa.pub b/vagrant/ovn/provisioning/id_rsa.pub new file mode 100644 index 0000000000..e5c4e3d2d2 --- /dev/null +++ b/vagrant/ovn/provisioning/id_rsa.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/YTIeTfzY30sYw8AZsAb2t5rqpw74j6qPs6xxTWTwbGdg7QGEdg8zN9PVGB4EN6U3IzbZI2LJKviJNAMFDGC6etQJ1No27l2bNhPryCJ6qcf4JFGOkvFd5wfaFy8rIXHmqaEy3jMTdBYIO/YkmIHkIahXuwYLLVpNhsUkF4rAxQykHA/ruukF1Vyk2N5KTDwUoO89XHWnU7RiB4j0mggvSqRroUWCKKL/B/mOCvTD8lbXlUjaljCkeF2cG3czcFXYcrlwDqfAWFR8AbQcs/mVQZb38eTmeD9aXtzPycsB2Bd/hRwhR987lIf738flWFMwOlpE+DFa47DX9QYuB/nv vagrant@ovn
\ No newline at end of file diff --git a/vagrant/ovn/provisioning/provider-setup.sh b/vagrant/ovn/provisioning/provider-setup.sh new file mode 100644 index 0000000000..03f3dd6ef7 --- /dev/null +++ b/vagrant/ovn/provisioning/provider-setup.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +function provider_setup { + # Save the existing address from eth2 and add it to br-provider + + if ip a | grep enp0; then + PROV_IF=enp0s9 + else + PROV_IF=eth2 + fi + + PROVADDR=$(ip -4 addr show $PROV_IF | grep -oP "(?<=inet ).*(?= brd)") + if [ -n "$PROVADDR" ]; then + sudo ip addr flush dev $PROV_IF + sudo ip addr add $PROVADDR dev br-provider + sudo ip link set br-provider up + sudo ovs-vsctl --may-exist add-port br-provider $PROV_IF + fi +} diff --git a/vagrant/ovn/provisioning/providers.rb b/vagrant/ovn/provisioning/providers.rb new file mode 100644 index 0000000000..1f844f71df --- /dev/null +++ b/vagrant/ovn/provisioning/providers.rb @@ -0,0 +1,42 @@ + +def provider_box(provider) + distro = ENV.fetch('DISTRO', 'ubuntu') + boxes = YAML.load_file('../provisioning/boxes.yml')[distro] + + # we can always override the box via the VAGRANT_OVN_VM_BOX + # environment variable + return ENV.fetch('VAGRANT_OVN_VM_BOX', boxes[provider]) +end + +def configure_providers(vm, config) + vm.provider 'virtualbox' do |vb, cfg| + cfg.vm.box = provider_box('virtualbox') + vb.memory = config['memory'] + vb.cpus = config['cpus'] + vb.customize [ + 'modifyvm', :id, + '--nicpromisc3', "allow-all" + ] + vb.customize [ + "guestproperty", "set", :id, + "/VirtualBox/GuestAdd/VBoxService/--timesync-set-threshold", 10000 + ] + end + + vm.provider 'parallels' do |vb, cfg| + cfg.vm.box = provider_box('parallels') + vb.memory = config['memory'] + vb.cpus = config['cpus'] + vb.customize ['set', :id, '--nested-virt', 'on'] + end + + vm.provider 'libvirt' do |vb, cfg| + cfg.vm.box = provider_box('libvirt') + vb.memory = config['memory'] + vb.cpus = config['cpus'] + vb.nested = true + vb.graphics_type = 'spice' + vb.video_type = 'qxl' + vb.suspend_mode = 'managedsave' + end +end diff --git a/vagrant/ovn/provisioning/setup-base.sh b/vagrant/ovn/provisioning/setup-base.sh new file mode 100644 index 0000000000..5e97736145 --- /dev/null +++ b/vagrant/ovn/provisioning/setup-base.sh @@ -0,0 +1,104 @@ +#!/bin/sh + +# Script Arguments: +# $1 - MTU +# $2 - ovn-db IP address +# $3 - ovn-db short name +# $4 - ovn-controller IP address +# $5 - ovn-controller short name +# $6 - ovn-compute1 IP address +# $7 - ovn-compute1 short name +# $8 - ovn-compute2 IP address +# $9 - ovn-compute2 short name +# $10 - ovn-vtep IP address +# $11 - ovn-vtep short name +MTU=$1 +OVN_DB_IP=$2 +OVN_DB_NAME=$3 +OVN_CONTROLLER_IP=$4 +OVN_CONTROLLER_NAME=$5 +OVN_COMPUTE1_IP=$6 +OVN_COMPUTE1_NAME=$7 +OVN_COMPUTE2_IP=$8 +OVN_COMPUTE2_NAME=$9 +OVN_VTEP_IP=$10 +OVN_VTEP_NAME=$11 + +BASE_PACKAGES="git bridge-utils ebtables python-pip python-dev build-essential ntp" +DEBIAN_FRONTEND=noninteractive sudo apt-get -qqy update +DEBIAN_FRONTEND=noninteractive sudo apt-get install -qqy $BASE_PACKAGES +echo export LC_ALL=en_US.UTF-8 >> ~/.bash_profile +echo export LANG=en_US.UTF-8 >> ~/.bash_profile +# FIXME(mestery): Remove once Vagrant boxes allow apt-get to work again +sudo rm -rf /var/lib/apt/lists/* +sudo apt-get install -y git + +# FIXME(mestery): By default, Ubuntu ships with /bin/sh pointing to +# the dash shell. +# .. +# .. +# The dots above represent a pause as you pick yourself up off the +# floor. This means the latest version of "install_docker.sh" to load +# docker fails because dash can't interpret some of it's bash-specific +# things. It's a bug in install_docker.sh that it relies on those and +# uses a shebang of /bin/sh, but that doesn't help us if we want to run +# docker and specifically Kuryr. So, this works around that. +sudo update-alternatives --install /bin/sh sh /bin/bash 100 + +if [ ! -d "devstack" ]; then + git clone https://git.openstack.org/openstack-dev/devstack.git +fi + +# If available, use repositories on host to facilitate testing local changes. +# Vagrant requires that shared folders exist on the host, so additionally +# check for the ".git" directory in case the parent exists but lacks +# repository contents. + +if [ ! -d "neutron/.git" ]; then + git clone https://git.openstack.org/openstack/neutron.git +fi + +# Use neutron in vagrant home directory when stacking. +sudo mkdir /opt/stack +sudo chown vagrant:vagrant /opt/stack +ln -s ~/neutron /opt/stack/neutron + +# We need swap space to do any sort of scale testing with the Vagrant config. +# Without this, we quickly run out of RAM and the kernel starts whacking things. +sudo rm -f /swapfile1 +sudo dd if=/dev/zero of=/swapfile1 bs=1024 count=2097152 +sudo chown root:root /swapfile1 +sudo chmod 0600 /swapfile1 +sudo mkswap /swapfile1 +sudo swapon /swapfile1 + +# Configure MTU on VM interfaces. Also requires manually configuring the same MTU on +# the equivalent 'vboxnet' interfaces on the host. + +if ip a | grep enp0; then + sudo ip link set dev enp0s8 mtu $MTU + sudo ip link set dev enp0s9 mtu $MTU +else + sudo ip link set dev eth1 mtu $MTU + sudo ip link set dev eth2 mtu $MTU +fi + +# Migration setup +sudo sh -c "echo \"$OVN_DB_IP $OVN_DB_NAME\" >> /etc/hosts" +sudo sh -c "echo \"$OVN_CONTROLLER_IP $OVN_CONTROLLER_NAME\" >> /etc/hosts" +sudo sh -c "echo \"$OVN_COMPUTE1_IP $OVN_COMPUTE1_NAME\" >> /etc/hosts" +sudo sh -c "echo \"$OVN_COMPUTE2_IP $OVN_COMPUTE2_NAME\" >> /etc/hosts" +sudo sh -c "echo \"$OVN_VTEP_IP $OVN_VTEP_NAME\" >> /etc/hosts" + +# Non-interactive SSH setup +cp neutron/vagrant/ovn/provisioning/id_rsa ~/.ssh/id_rsa +cat neutron/vagrant/ovn/provisioning/id_rsa.pub >> ~/.ssh/authorized_keys +chmod 600 ~/.ssh/id_rsa +echo "Host *" >> ~/.ssh/config +echo " StrictHostKeyChecking no" >> ~/.ssh/config +chmod 600 ~/.ssh/config +sudo mkdir /root/.ssh +chmod 700 /root/.ssh +sudo cp ~vagrant/.ssh/id_rsa /root/.ssh +sudo cp ~vagrant/.ssh/authorized_keys /root/.ssh +sudo cp ~vagrant/.ssh/config /root/.ssh/config diff --git a/vagrant/ovn/provisioning/setup-compute.sh b/vagrant/ovn/provisioning/setup-compute.sh new file mode 100644 index 0000000000..63a68bcee8 --- /dev/null +++ b/vagrant/ovn/provisioning/setup-compute.sh @@ -0,0 +1,103 @@ +#!/usr/bin/env bash + +# Script Arguments: +# $1 - ovn-controller IP address +# $2 - ovn-db IP address +OVN_CONTROLLER_IP=$1 +OVN_DB_IP=$2 + +cp neutron/devstack/ovn-compute-local.conf.sample devstack/local.conf +sed -i -e 's/<IP address of host running everything else>/'$OVN_CONTROLLER_IP'/g' devstack/local.conf + +sudo umount /opt/stack/data/nova/instances + +# Get the IP address +if ip a | grep enp0 ; then + ipaddress=$(ip -4 addr show enp0s8 | grep -oP "(?<=inet ).*(?=/)") +else + ipaddress=$(ip -4 addr show eth1 | grep -oP "(?<=inet ).*(?=/)") +fi + +# Fixup HOST_IP with the local IP address +sed -i -e 's/<IP address of current host>/'$ipaddress'/g' devstack/local.conf + +# Adjust some things in local.conf +cat << DEVSTACKEOF >> devstack/local.conf + +# Set this to the address of the main DevStack host running the rest of the +# OpenStack services. +Q_HOST=$1 +HOSTNAME=$(hostname) +OVN_SB_REMOTE=tcp:$OVN_DB_IP:6642 +OVN_NB_REMOTE=tcp:$OVN_DB_IP:6641 + +# Enable logging to files. +LOGFILE=/opt/stack/log/stack.sh.log + +# Use provider network for public. +Q_USE_PROVIDERNET_FOR_PUBLIC=True +OVS_PHYSICAL_BRIDGE=br-provider +PHYSICAL_NETWORK=provider + +# Until OVN supports NAT, the private network IP address range +# must not conflict with IP address ranges on the host. Change +# as necessary for your environment. +NETWORK_GATEWAY=172.16.1.1 +FIXED_RANGE=172.16.1.0/24 + +ENABLE_CHASSIS_AS_GW=False +DEVSTACKEOF + +# Add unique post-config for DevStack here using a separate 'cat' with +# single quotes around EOF to prevent interpretation of variables such +# as $Q_DHCP_CONF_FILE. + +cat << 'DEVSTACKEOF' >> devstack/local.conf + +# Set the availablity zone name (default is nova) for the DHCP service. +[[post-config|$Q_DHCP_CONF_FILE]] +[AGENT] +availability_zone = nova +DEVSTACKEOF + +devstack/stack.sh + +# Build the provider network in OVN. You can enable instances to access +# external networks such as the Internet by using the IP address of the host +# vboxnet interface for the provider network (typically vboxnet1) as the +# gateway for the subnet on the neutron provider network. Also requires +# enabling IP forwarding and configuring SNAT on the host. See the README for +# more information. + +source /vagrant/provisioning/provider-setup.sh + +provider_setup + +# Add host route for the private network, at least until the native L3 agent +# supports NAT. +# FIXME(mkassawara): Add support for IPv6. +source devstack/openrc admin admin +ROUTER_GATEWAY=`neutron port-list -c fixed_ips -c device_owner | grep router_gateway | awk -F'ip_address' '{ print $2 }' | cut -f3 -d\"` +sudo ip route add $FIXED_RANGE via $ROUTER_GATEWAY + +# NFS Setup +sudo apt-get update +sudo apt-get install -y nfs-common +sudo mkdir -p /opt/stack/data/nova/instances +sudo chmod o+x /opt/stack/data/nova/instances +sudo chown vagrant:vagrant /opt/stack/data/nova/instances +sudo sh -c "echo \"$OVN_CONTROLLER_IP:/opt/stack/data/nova/instances /opt/stack/data/nova/instances nfs defaults 0 0\" >> /etc/fstab" +sudo mount /opt/stack/data/nova/instances +sudo chown vagrant:vagrant /opt/stack/data/nova/instances +sudo sh -c "echo \"listen_tls = 0\" >> /etc/libvirt/libvirtd.conf" +sudo sh -c "echo \"listen_tcp = 1\" >> /etc/libvirt/libvirtd.conf" +sudo sh -c "echo -n \"auth_tcp =\" >> /etc/libvirt/libvirtd.conf" +sudo sh -c 'echo " \"none\"" >> /etc/libvirt/libvirtd.conf' +sudo sh -c "sed -i 's/env libvirtd_opts\=\"\-d\"/env libvirtd_opts\=\"-d -l\"/g' /etc/init/libvirt-bin.conf" +sudo sh -c "sed -i 's/libvirtd_opts\=\"\-d\"/libvirtd_opts\=\"\-d \-l\"/g' /etc/default/libvirt-bin" +sudo /etc/init.d/libvirt-bin restart + +# Set the OVN_*_DB variables to enable OVN commands using a remote database. +echo -e "\n# Enable OVN commands using a remote database. +export OVN_NB_DB=$OVN_NB_REMOTE +export OVN_SB_DB=$OVN_SB_REMOTE" >> ~/.bash_profile diff --git a/vagrant/ovn/provisioning/setup-controller.sh b/vagrant/ovn/provisioning/setup-controller.sh new file mode 100644 index 0000000000..361e294ee2 --- /dev/null +++ b/vagrant/ovn/provisioning/setup-controller.sh @@ -0,0 +1,130 @@ +#!/usr/bin/env bash + +# Script Arguments: +# $1 - ovn-db IP address +# $2 - provider network starting IP address +# $3 - provider network ending IP address +# $4 - provider network gateway +# $5 - provider network network +# $6 - ovn vm subnet +ovnip=$1 +start_ip=$2 +end_ip=$3 +gateway=$4 +network=$5 +ovn_vm_subnet=$6 + + +# Get the IP address +if ip a | grep enp0 ; then + ipaddress=$(ip -4 addr show enp0s8 | grep -oP "(?<=inet ).*(?=/)") +else + ipaddress=$(ip -4 addr show eth1 | grep -oP "(?<=inet ).*(?=/)") +fi + +# Adjust some things in local.conf +cat << DEVSTACKEOF >> devstack/local.conf.vagrant + +# Good to set these +HOST_IP=$ipaddress +HOSTNAME=$(hostname) +SERVICE_HOST_NAME=${HOST_NAME} +SERVICE_HOST=$ipaddress +OVN_SB_REMOTE=tcp:$ovnip:6642 +OVN_NB_REMOTE=tcp:$ovnip:6641 + +# Enable logging to files. +LOGFILE=/opt/stack/log/stack.sh.log + +# Disable the ovn-northd service on the controller node because the +# architecture includes a separate OVN database server. +disable_service ovn-northd + +# Disable the ovn-controller service because the architecture lacks services +# on the controller node that depend on it. +disable_service ovn-controller + +# Disable the ovn metadata agent. +disable_service neutron-ovn-metadata-agent + +# Disable the nova compute service on the controller node because the +# architecture only deploys it on separate compute nodes. +disable_service n-cpu + +# Disable cinder services and tempest to reduce deployment time. +disable_service c-api c-sch c-vol tempest + +# Until OVN supports NAT, the private network IP address range +# must not conflict with IP address ranges on the host. Change +# as necessary for your environment. +NETWORK_GATEWAY=172.16.1.1 +FIXED_RANGE=172.16.1.0/24 + +# Use provider network for public. +Q_USE_PROVIDERNET_FOR_PUBLIC=True +OVS_PHYSICAL_BRIDGE=br-provider +PHYSICAL_NETWORK=provider +PUBLIC_NETWORK_NAME=provider +PUBLIC_NETWORK_GATEWAY="$gateway" +PUBLIC_PHYSICAL_NETWORK=provider +PUBLIC_SUBNET_NAME=provider-v4 +IPV6_PUBLIC_SUBNET_NAME=provider-v6 +Q_FLOATING_ALLOCATION_POOL="start=$start_ip,end=$end_ip" +FLOATING_RANGE="$network" + +# If the admin wants to enable this chassis to host gateway routers for +# external connectivity, then set ENABLE_CHASSIS_AS_GW to True. +# Then devstack will set ovn-cms-options with enable-chassis-as-gw +# in Open_vSwitch table's external_ids column +ENABLE_CHASSIS_AS_GW=True +DEVSTACKEOF + +# Add unique post-config for DevStack here using a separate 'cat' with +# single quotes around EOF to prevent interpretation of variables such +# as $NEUTRON_CONF. + +cat << 'DEVSTACKEOF' >> devstack/local.conf.vagrant + +# Enable two DHCP agents per neutron subnet with support for availability +# zones. Requires two or more compute nodes. + +[[post-config|/$NEUTRON_CONF]] +[DEFAULT] +network_scheduler_driver = neutron.scheduler.dhcp_agent_scheduler.AZAwareWeightScheduler +dhcp_load_type = networks +dhcp_agents_per_network = 2 + +# Configure the Compute service (nova) metadata API to use the X-Forwarded-For +# header sent by the Networking service metadata proxies on the compute nodes. + +[[post-config|$NOVA_CONF]] +[DEFAULT] +use_forwarded_for = True +DEVSTACKEOF + + +sed '/#EXTRA_CONFIG/ r devstack/local.conf.vagrant' \ + neutron/devstack/ovn-local.conf.sample > devstack/local.conf + + +devstack/stack.sh + +# Make the provider network shared and enable DHCP for its v4 subnet. +source devstack/openrc admin admin +neutron net-update --shared $PUBLIC_NETWORK_NAME +neutron subnet-update --enable_dhcp=True $PUBLIC_SUBNET_NAME + +# NFS server setup +sudo apt-get update +sudo apt-get install -y nfs-kernel-server nfs-common +sudo mkdir -p /opt/stack/data/nova/instances +sudo touch /etc/exports +sudo sh -c "echo \"/opt/stack/data/nova/instances $ovn_vm_subnet(rw,sync,fsid=0,no_root_squash)\" >> /etc/exports" +sudo service nfs-kernel-server restart +sudo service nfs-idmapd restart + +# Set the OVN_*_DB variables to enable OVN commands using a remote database. +echo -e "\n# Enable OVN commands using a remote database. +export OVN_NB_DB=$OVN_NB_REMOTE +export OVN_SB_DB=$OVN_SB_REMOTE" >> ~/.bash_profile + diff --git a/vagrant/ovn/provisioning/setup-db.sh b/vagrant/ovn/provisioning/setup-db.sh new file mode 100644 index 0000000000..d677abb0ef --- /dev/null +++ b/vagrant/ovn/provisioning/setup-db.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +CONTROLLER_IP=$1 + +cp neutron/devstack/ovn-db-local.conf.sample devstack/local.conf +if [ "$CONTROLLER_IP" != "" ]; then + sed -i -e 's/<IP address of host running everything else>/'$CONTROLLER_IP'/g' devstack/local.conf +fi + +# Get the IP address +if ip a | grep enp0 ; then + ipaddress=$(ip -4 addr show enp0s8 | grep -oP "(?<=inet ).*(?=/)") +else + ipaddress=$(ip -4 addr show eth1 | grep -oP "(?<=inet ).*(?=/)") +fi + +# Adjust some things in local.conf +cat << DEVSTACKEOF >> devstack/local.conf + +# Set this to the address of the main DevStack host running the rest of the +# OpenStack services. +Q_HOST=$CONTROLLER_IP +HOST_IP=$ipaddress +HOSTNAME=$(hostname) + +# Enable logging to files. +LOGFILE=/opt/stack/log/stack.sh.log +DEVSTACKEOF + +devstack/stack.sh diff --git a/vagrant/ovn/provisioning/setup-vtep.sh b/vagrant/ovn/provisioning/setup-vtep.sh new file mode 100644 index 0000000000..701cff2166 --- /dev/null +++ b/vagrant/ovn/provisioning/setup-vtep.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env bash +OVN_DB_IP=$2 + +cp neutron/devstack/ovn-vtep-local.conf.sample devstack/local.conf +if [ "$1" != "" ]; then + sed -i -e 's/<IP address of host running everything else>/'$1'/g' devstack/local.conf +fi + +# Get the IP address +if ip a | grep enp0 ; then + ipaddress=$(ip -4 addr show enp0s8 | grep -oP "(?<=inet ).*(?=/)") +else + ipaddress=$(ip -4 addr show eth1 | grep -oP "(?<=inet ).*(?=/)") +fi + +# Adjust some things in local.conf +cat << DEVSTACKEOF >> devstack/local.conf + +# Set this to the address of the main DevStack host running the rest of the +# OpenStack services. +Q_HOST=$1 +HOST_IP=$ipaddress +HOSTNAME=$(hostname) + +OVN_SB_REMOTE=tcp:$OVN_DB_IP:6642 +OVN_NB_REMOTE=tcp:$OVN_DB_IP:6641 + +# Enable logging to files. +LOGFILE=/opt/stack/log/stack.sh.log +DEVSTACKEOF + +devstack/stack.sh diff --git a/vagrant/ovn/sparse/README.rst b/vagrant/ovn/sparse/README.rst new file mode 100644 index 0000000000..43bf35b5a5 --- /dev/null +++ b/vagrant/ovn/sparse/README.rst @@ -0,0 +1,9 @@ +=================== +Sparse architecture +=================== + +Please reference the files in +/doc/source/contributor/ovn_vagrant/sparse-architecture.rst for more +information about this architecture. + + diff --git a/vagrant/ovn/sparse/Vagrantfile b/vagrant/ovn/sparse/Vagrantfile new file mode 100644 index 0000000000..71ad148f06 --- /dev/null +++ b/vagrant/ovn/sparse/Vagrantfile @@ -0,0 +1,96 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +require 'yaml' +require 'ipaddr' +require '../provisioning/providers.rb' + +vagrant_config = YAML.load_file("instances.yml") + +Vagrant.configure(2) do |config| + + if Vagrant.has_plugin?("vagrant-cachier") + # Configure cached packages to be shared between instances of the same base box. + # More info on http://fgrehm.viewdocs.io/vagrant-cachier/usage + config.cache.scope = :box + end + + config.vm.synced_folder ".", "/vagrant", disabled: true + config.vm.synced_folder File.expand_path(".."), "/vagrant" + config.vm.synced_folder File.expand_path("../.."), "/home/vagrant/neutron" + + # Use the ipaddr library to calculate the netmask of a given network + net = IPAddr.new vagrant_config['provider_network'] + netmask = net.inspect().split("/")[1].split(">")[0] + + # Build the common args for the setup-base.sh scripts. + setup_base_common_args = "#{vagrant_config['ovndb']['ip']} #{vagrant_config['ovndb']['short_name']} " + + "#{vagrant_config['ovncontroller']['ip']} #{vagrant_config['ovncontroller']['short_name']} " + + "#{vagrant_config['ovncompute1']['ip']} #{vagrant_config['ovncompute1']['short_name']} " + + "#{vagrant_config['ovncompute2']['ip']} #{vagrant_config['ovncompute2']['short_name']} " + + "#{vagrant_config['ovnvtep']['ip']} #{vagrant_config['ovnvtep']['short_name']} " + + # Bring up the Devstack ovsdb/ovn-northd node + config.vm.define "ovn-db" do |ovndb| + cfg = vagrant_config['ovndb'] + ovndb.vm.host_name = cfg['host_name'] + ovndb.vm.network "private_network", ip: cfg['ip'] + ovndb.vm.network "private_network", ip: cfg['prov-ip'], netmask: netmask + ovndb.vm.provision "shell", path: "../provisioning/setup-base.sh", privileged: false, + :args => "#{vagrant_config['ovndb']['mtu']} #{setup_base_common_args}" + ovndb.vm.provision "shell", path: "../provisioning/setup-db.sh", privileged: false, :args => "#{vagrant_config['ovncontroller']['ip']}" + + configure_providers(ovndb.vm, cfg) + end + + # Bring up the Devstack controller node on Virtualbox + config.vm.define "ovn-controller", primary: true do |ovncontroller| + cfg = vagrant_config['ovncontroller'] + ovncontroller.vm.host_name = cfg['host_name'] + ovncontroller.vm.network "private_network", ip: cfg['ip'] + ovncontroller.vm.network "private_network", ip: cfg['prov-ip'], netmask: netmask + ovncontroller.vm.provision "shell", path: "../provisioning/setup-base.sh", privileged: false, + :args => "#{cfg['mtu']} #{setup_base_common_args}" + ovncontroller.vm.provision "shell", path: "../provisioning/setup-controller.sh", privileged: false, + :args => "#{vagrant_config['ovndb']['ip']} #{vagrant_config['provider_start_ip']} #{vagrant_config['provider_end_ip']} " + + "#{vagrant_config['provider_gateway']} #{vagrant_config['provider_network']} #{vagrant_config['ovn_vm_subnet']}" + configure_providers(ovncontroller.vm, cfg) + end + + config.vm.define "ovn-vtep", autostart: false do |ovnvtep| + cfg = vagrant_config['ovnvtep'] + ovnvtep.vm.host_name = cfg['host_name'] + ovnvtep.vm.network "private_network", ip: cfg['ip'] + ovnvtep.vm.network "private_network", ip: cfg['prov-ip'], netmask: netmask + ovnvtep.vm.provision "shell", path: "../provisioning/setup-base.sh", privileged: false, + :args => "#{cfg['mtu']} #{setup_base_common_args}" + ovnvtep.vm.provision "shell", path: "../provisioning/setup-vtep.sh", privileged: false, :args => "#{vagrant_config['ovncontroller']['ip']} #{vagrant_config['ovndb']['ip']}" + configure_providers(ovnvtep.vm, cfg) + end + + # Bring up the first Devstack compute node on Virtualbox + config.vm.define "ovn-compute1" do |ovncompute1| + cfg = vagrant_config['ovncompute1'] + ovncompute1.vm.host_name = cfg['host_name'] + ovncompute1.vm.network "private_network", ip: cfg['ip'] + ovncompute1.vm.network "private_network", ip: cfg['prov-ip'], netmask: netmask + ovncompute1.vm.provision "shell", path: "../provisioning/setup-base.sh", privileged: false, + :args => "#{cfg['mtu']} #{setup_base_common_args}" + ovncompute1.vm.provision "shell", path: "../provisioning/setup-compute.sh", privileged: false, + :args => "#{vagrant_config['ovncontroller']['ip']} #{vagrant_config['ovndb']['ip']}" + configure_providers(ovncompute1.vm, cfg) + end + + # Bring up the second Devstack compute node on Virtualbox + config.vm.define "ovn-compute2" do |ovncompute2| + cfg = vagrant_config['ovncompute2'] + ovncompute2.vm.host_name = cfg['host_name'] + ovncompute2.vm.network "private_network", ip: cfg['ip'] + ovncompute2.vm.network "private_network", ip: cfg['prov-ip'], netmask: netmask + ovncompute2.vm.provision "shell", path: "../provisioning/setup-base.sh", privileged: false, + :args => "#{cfg['mtu']} #{setup_base_common_args}" + ovncompute2.vm.provision "shell", path: "../provisioning/setup-compute.sh", privileged: false, + :args => "#{vagrant_config['ovncontroller']['ip']} #{vagrant_config['ovndb']['ip']}" + configure_providers(ovncompute2.vm, cfg) + end +end diff --git a/vagrant/ovn/sparse/instances.yml b/vagrant/ovn/sparse/instances.yml new file mode 100644 index 0000000000..a4548da245 --- /dev/null +++ b/vagrant/ovn/sparse/instances.yml @@ -0,0 +1,46 @@ +--- +provider_network: "10.10.0.0/16" +provider_gateway: "10.10.0.1" +provider_start_ip: "10.10.0.101" +provider_end_ip: "10.10.255.250" +ovn_vm_subnet: "192.168.33.0/24" +ovndb: + short_name: "ovn-db" + host_name: "ovn-db.devstack.dev" + ip: "192.168.33.11" + prov-ip: "10.10.0.11" + memory: 512 + cpus: 2 + mtu: 1500 +ovncontroller: + short_name: "ovn-controller" + host_name: "ovn-controller.devstack.dev" + ip: "192.168.33.12" + prov-ip: "10.10.0.12" + memory: 3072 + cpus: 2 + mtu: 1500 +ovnvtep: + short_name: "ovn-vtep" + host_name: "ovn-vtep.devstack.dev" + ip: "192.168.33.13" + prov-ip: "10.10.0.13" + memory: 512 + cpus: 1 + mtu: 1500 +ovncompute1: + short_name: "ovn-compute1" + host_name: "ovn-compute1.devstack.dev" + ip: "192.168.33.31" + prov-ip: "10.10.0.31" + memory: 1536 + cpus: 1 + mtu: 1500 +ovncompute2: + short_name: "ovn-compute2" + host_name: "ovn-compute2.devstack.dev" + ip: "192.168.33.32" + prov-ip: "10.10.0.32" + memory: 1536 + cpus: 1 + mtu: 1500 |
