Adds OpenDaylight
authorTim Rozet <trozet@redhat.com>
Tue, 28 Jun 2016 18:52:36 +0000 (14:52 -0400)
committerTim Rozet <trozet@redhat.com>
Sat, 13 Aug 2016 19:34:22 +0000 (15:34 -0400)
Partially-Implements: blueprint opendaylight-integration

Note this patch only adds support for a single ODL instance.

 - neutron/opendaylight.pp handles installing ODL to control nodes
 - ml2/opendaylight.pp handles configuring ML2 to work with ODL
 - ovs/opendaylight.pp handles configuring OVS to connect to ODL

Change-Id: I666dc0874f1d11a72a62d796f4f6d41f7aa87a3f
Signed-off-by: Tim Rozet <trozet@redhat.com>
manifests/haproxy.pp
manifests/profile/base/neutron/opendaylight.pp [new file with mode: 0644]
manifests/profile/base/neutron/plugins/ml2.pp
manifests/profile/base/neutron/plugins/ml2/opendaylight.pp [new file with mode: 0644]
manifests/profile/base/neutron/plugins/ovs/opendaylight.pp [new file with mode: 0644]

index e2b2cc9..075433b 100644 (file)
 #
 # [*zaqar_api*]
 #  (optional) Enable or not Zaqar Api binding
+# Defaults to false
+#
+# [*opendaylight*]
+#  (optional) Enable or not OpenDaylight binding
 #  Defaults to false
 #
 # [*service_ports*]
@@ -329,6 +333,7 @@ class tripleo::haproxy (
   $redis_password            = undef,
   $midonet_api               = false,
   $zaqar_api                 = false,
+  $opendaylight              = false,
   $service_ports             = {}
 ) {
   $default_service_ports = {
@@ -924,4 +929,27 @@ class tripleo::haproxy (
       public_ssl_port   => $ports[zaqar_api_ssl_port],
     }
   }
+
+  $opendaylight_api_vip = hiera('opendaylight_api_vip', $controller_virtual_ip)
+  $opendaylight_bind_opts = {
+    "${opendaylight_api_vip}:8081" => [],
+    "${public_virtual_ip}:8081" => [],
+  }
+
+  if $opendaylight {
+    haproxy::listen { 'opendaylight':
+      bind             => $opendaylight_bind_opts,
+      options          => {
+        'balance' => 'source',
+      },
+      collect_exported => false,
+    }
+    haproxy::balancermember { 'opendaylight':
+      listening_service => 'opendaylight',
+      ports             => '8081',
+      ipaddresses       => hiera('opendaylight_api_node_ips', $controller_hosts_real),
+      server_names      => $controller_hosts_names_real,
+      options           => ['check', 'inter 2000', 'rise 2', 'fall 5'],
+    }
+  }
 }
diff --git a/manifests/profile/base/neutron/opendaylight.pp b/manifests/profile/base/neutron/opendaylight.pp
new file mode 100644 (file)
index 0000000..ffe28ce
--- /dev/null
@@ -0,0 +1,46 @@
+# Copyright 2016 Red Hat, Inc.
+#
+# 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.
+#
+# == Class: tripleo::profile::base::neutron::opendaylight
+#
+# OpenDaylight Neutron profile for TripleO
+#
+# === Parameters
+#
+# [*step*]
+#   (Optional) The current step of the deployment
+#   Defaults to hiera('step')
+#
+# [*primary_controller*]
+#   (Optional) The hostname of the first controller
+#   Defaults to hiera('bootstrap_nodeid', undef)
+#
+class tripleo::profile::base::neutron::opendaylight (
+  $step = hiera('step'),
+  $primary_controller = hiera('bootstrap_nodeid', undef),
+) {
+
+  include ::tripleo::profile::base::neutron
+
+  if ! str2bool(hiera('opendaylight::enable_l3')) {
+    include ::tripleo::profile::base::neutron::l3
+  }
+
+  if $step >= 1 {
+    # Configure ODL only on first controller
+    if hiera('odl_on_controller') and $primary_controller == downcase($::hostname) {
+      include ::opendaylight
+    }
+  }
+}
index c89bc02..401e627 100644 (file)
@@ -63,5 +63,10 @@ class tripleo::profile::base::neutron::plugins::ml2 (
     if 'bsn_ml2' in $mechanism_drivers {
       include ::neutron::plugins::ml2::bigswitch::restproxy
     }
+
+    if 'opendaylight' in $mechanism_drivers {
+      include ::tripleo::profile::base::neutron::plugins::ml2::opendaylight
+    }
+
   }
 }
diff --git a/manifests/profile/base/neutron/plugins/ml2/opendaylight.pp b/manifests/profile/base/neutron/plugins/ml2/opendaylight.pp
new file mode 100644 (file)
index 0000000..f25aea6
--- /dev/null
@@ -0,0 +1,54 @@
+# Copyright 2016 Red Hat, Inc.
+#
+# 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.
+#
+# == Class: tripleo::profile::base::neutron::plugins::ml2::opendaylight
+#
+# OpenDaylight ML2 Neutron profile for TripleO
+#
+# === Parameters
+#
+# [*odl_port*]
+#   (Optional) Port to use for OpenDaylight
+#   Defaults to hiera('opendaylight::odl_rest_port')
+#
+# [*conn_proto*]
+#   (Optional) Protocol to use to for ODL REST access
+#   Defaults to hiera('opendaylight::nb_connection_protocol')
+#
+# [*step*]
+#   (Optional) The current step in deployment. See tripleo-heat-templates
+#   for more details.
+#   Defaults to hiera('step')
+#
+class tripleo::profile::base::neutron::plugins::ml2::opendaylight (
+  $odl_port   = hiera('opendaylight::odl_rest_port'),
+  $conn_proto = hiera('opendaylight::nb_connection_protocol'),
+  $step       = hiera('step'),
+) {
+
+  if $step >= 4 {
+    # Figure out ODL IP
+    if hiera('odl_on_controller') {
+      $odl_url_ip = hiera('opendaylight_api_vip')
+    } else {
+      $odl_url_ip = hiera('opendaylight::odl_bind_ip')
+    }
+
+    if ! $odl_url_ip { fail('OpenDaylight Controller IP/VIP is Empty') }
+
+    class { '::neutron::plugins::ml2::opendaylight':
+      odl_url      => "${conn_proto}://${odl_url_ip}:${odl_port}/controller/nb/v2/neutron";
+    }
+  }
+}
diff --git a/manifests/profile/base/neutron/plugins/ovs/opendaylight.pp b/manifests/profile/base/neutron/plugins/ovs/opendaylight.pp
new file mode 100644 (file)
index 0000000..7548046
--- /dev/null
@@ -0,0 +1,73 @@
+# Copyright 2016 Red Hat, Inc.
+#
+# 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.
+#
+# == Class: tripleo::profile::base::neutron::plugins::ovs::opendaylight
+#
+# OpenDaylight Neutron OVS profile for TripleO
+#
+# === Parameters
+#
+# [*odl_port*]
+#   (Optional) Port to use for OpenDaylight
+#   Defaults to hiera('opendaylight::odl_rest_port')
+#
+# [*odl_check_url*]
+#   (Optional) URL path used to check if ODL is up
+#   Defaults to hiera('opendaylight_check_url')
+#
+# [*odl_api_ips*]
+#   (Optional) List of OpenStack Controller IPs for ODL API
+#   Defaults to hiera('opendaylight_api_node_ips')
+#
+# [*conn_proto*]
+#   (Optional) Protocol to use to for ODL REST access
+#   Defaults to hiera('opendaylight::nb_connection_protocol')
+#
+# [*step*]
+#   (Optional) The current step in deployment. See tripleo-heat-templates
+#   for more details.
+#   Defaults to hiera('step')
+#
+class tripleo::profile::base::neutron::plugins::ovs::opendaylight (
+  $odl_port      = hiera('opendaylight::odl_rest_port'),
+  $odl_check_url = hiera('opendaylight_check_url'),
+  $odl_api_ips   = hiera('opendaylight_api_node_ips'),
+  $conn_proto    = hiera('opendaylight::nb_connection_protocol'),
+  $step          = hiera('step'),
+) {
+
+  if $step >= 4 {
+    # Figure out ODL IP (and VIP if on controller)
+    if hiera('odl_on_controller') {
+      $opendaylight_controller_ip = $odl_api_ips[0]
+      $odl_url_ip = hiera('opendaylight_api_vip')
+    } else {
+      $opendaylight_controller_ip = hiera('opendaylight::odl_bind_ip')
+      $odl_url_ip = $opendaylight_controller_ip
+    }
+
+    if ! $opendaylight_controller_ip { fail('OpenDaylight Controller IP is Empty') }
+
+    if ! $odl_url_ip { fail('OpenDaylight API VIP is Empty') }
+
+    # Build URL to check if ODL is up before connecting OVS
+    $opendaylight_url = "${conn_proto}://${odl_url_ip}:${odl_port}/${odl_check_url}"
+
+    class { '::neutron::plugins::ovs::opendaylight':
+      tunnel_ip       => hiera('neutron::agents::ml2::ovs::local_ip'),
+      odl_check_url   => $opendaylight_url,
+      odl_ovsdb_iface => "tcp:${opendaylight_controller_ip}:6640",
+    }
+  }
+}