1 From bdaa77b2b92f470fe0bc6b18bff5f2af1f7b65cf Mon Sep 17 00:00:00 2001
2 From: Tim Rozet <tdrozet@gmail.com>
3 Date: Tue, 23 Jun 2015 17:46:00 -0400
4 Subject: [PATCH] Adds OpenDaylight support
6 To enable set neturon Mechanism Drivers to opendaylight via ExtraConfig:
7 - EnableOpenDaylight (used to enable ODL, defaults to false)
8 - OpenDaylightPort (used to define ODL REST Port, default 8081)
10 Change-Id: I2a4c5b69ee0ad70d2372cad23b9af0890715c85f
11 Signed-off-by: Dan Radez <dradez@redhat.com>
13 environments/opendaylight.yaml | 4 +
14 puppet/compute.yaml | 6 +
15 puppet/controller.yaml | 8 +
16 puppet/manifests/overcloud_compute.pp | 31 +++-
17 puppet/manifests/overcloud_controller.pp | 49 +++++-
18 puppet/manifests/overcloud_controller_pacemaker.pp | 183 +++++++++++++--------
19 6 files changed, 201 insertions(+), 80 deletions(-)
20 create mode 100644 environments/opendaylight.yaml
22 diff --git a/environments/opendaylight.yaml b/environments/opendaylight.yaml
24 index 0000000..39e4aa3
26 +++ b/environments/opendaylight.yaml
30 + neutron_mechanism_drivers: ['opendaylight']
31 + neutron_tenant_network_type: vxlan
32 diff --git a/puppet/compute.yaml b/puppet/compute.yaml
33 index 2b63535..3f20d48 100644
34 --- a/puppet/compute.yaml
35 +++ b/puppet/compute.yaml
36 @@ -221,6 +221,10 @@ parameters:
42 + description: Set opendaylight service port
46 default: '' # Has to be here because of the ignored empty value bug
47 @@ -409,6 +413,7 @@ resources:
48 neutron::rabbit_user: {get_input: rabbit_user}
49 neutron::rabbit_use_ssl: {get_input: rabbit_client_use_ssl}
50 neutron::rabbit_port: {get_input: rabbit_client_port}
51 + opendaylight_port: {get_input: opendaylight_port}
52 neutron_flat_networks: {get_input: neutron_flat_networks}
53 neutron_host: {get_input: neutron_host}
54 neutron::agents::ml2::ovs::local_ip: {get_input: neutron_local_ip}
55 @@ -474,6 +479,7 @@ resources:
56 - {get_param: GlanceHost}
58 - {get_param: GlancePort}
59 + opendaylight_port: {get_param: OpenDaylightPort}
60 neutron_flat_networks: {get_param: NeutronFlatNetworks}
61 neutron_host: {get_param: NeutronHost}
62 neutron_local_ip: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NeutronTenantNetwork]}]}
63 diff --git a/puppet/controller.yaml b/puppet/controller.yaml
64 index 0bb8035..fa0dc3e 100644
65 --- a/puppet/controller.yaml
66 +++ b/puppet/controller.yaml
67 @@ -427,6 +427,10 @@ parameters:
73 + description: Set opendaylight service port
77 description: The password for the 'pcsd' user.
78 @@ -794,6 +798,7 @@ resources:
79 template: tripleo-CLUSTER
81 CLUSTER: {get_param: MysqlClusterUniquePart}
82 + opendaylight_port: {get_param: OpenDaylightPort}
83 neutron_flat_networks: {get_param: NeutronFlatNetworks}
84 neutron_metadata_proxy_shared_secret: {get_param: NeutronMetadataProxySharedSecret}
85 neutron_agent_mode: {get_param: NeutronAgentMode}
86 @@ -1136,6 +1141,9 @@ resources:
87 mysql_bind_host: {get_input: mysql_network}
88 mysql_virtual_ip: {get_input: mysql_virtual_ip}
91 + opendaylight_port: {get_input: opendaylight_port}
94 neutron::bind_host: {get_input: neutron_api_network}
95 neutron::rabbit_password: {get_input: rabbit_password}
96 diff --git a/puppet/manifests/overcloud_compute.pp b/puppet/manifests/overcloud_compute.pp
97 index 2150bab..9846636 100644
98 --- a/puppet/manifests/overcloud_compute.pp
99 +++ b/puppet/manifests/overcloud_compute.pp
100 @@ -21,6 +21,8 @@ if count(hiera('ntp::servers')) > 0 {
104 +$controller_node_ips = split(hiera('controller_node_ips'), ',')
106 file { ['/etc/libvirt/qemu/networks/autostart/default.xml',
107 '/etc/libvirt/qemu/networks/default.xml']:
109 @@ -74,9 +76,32 @@ class { 'neutron::plugins::ml2':
110 tenant_network_types => [hiera('neutron_tenant_network_type')],
113 -class { 'neutron::agents::ml2::ovs':
114 - bridge_mappings => split(hiera('neutron_bridge_mappings'), ','),
115 - tunnel_types => split(hiera('neutron_tunnel_types'), ','),
116 +if 'opendaylight' in hiera('neutron_mechanism_drivers') {
117 + $opendaylight_port = hiera('opendaylight_port')
118 + $private_ip = hiera('neutron::agents::ml2::ovs::local_ip')
120 + exec { 'Wait for NetVirt OVS to come up':
121 + command => "/bin/curl -o /dev/null --fail --silent --head -u admin:admin \
122 + http://${controller_node_ips[0]}:${opendaylight_port}/restconf/operational/network-topology:network-topology",
127 + exec { 'Set OVS Manager to OpenDaylight':
128 + command => "/usr/bin/ovs-vsctl set-manager tcp:${controller_node_ips[0]}:6640",
129 + unless => "/usr/bin/ovs-vsctl show | /usr/bin/grep 'Manager \"tcp:${controller_node_ips[0]}:6640\"'",
132 + exec { 'Set local_ip Other Option':
133 + command => "/usr/bin/ovs-vsctl set Open_vSwitch $(ovs-vsctl get Open_vSwitch . _uuid) other_config:local_ip=$private_ip",
134 + unless => "/usr/bin/ovs-vsctl list Open_vSwitch | /usr/bin/grep 'local_ip=\"$private_ip\"'",
138 + class { 'neutron::agents::ml2::ovs':
139 + bridge_mappings => split(hiera('neutron_bridge_mappings'), ','),
140 + tunnel_types => split(hiera('neutron_tunnel_types'), ','),
144 if 'cisco_n1kv' in hiera('neutron_mechanism_drivers') {
145 diff --git a/puppet/manifests/overcloud_controller.pp b/puppet/manifests/overcloud_controller.pp
146 index c330236..68739a6 100644
147 --- a/puppet/manifests/overcloud_controller.pp
148 +++ b/puppet/manifests/overcloud_controller.pp
149 @@ -30,6 +30,13 @@ if hiera('step') >= 1 {
151 if hiera('step') >= 2 {
153 + if 'opendaylight' in hiera('neutron_mechanism_drivers') {
154 + class {"opendaylight":
155 + extra_features => ['odl-ovsdb-openstack', 'odl-dlux-core', 'odl-sfc-core', 'odl-sfc-ui', 'odl-sfc-sb-rest', 'odl-sfc-ovs', 'odl-sfc-netconf', 'odl-sfclisp', 'odl-sfcofl2'],
156 + odl_rest_port => hiera('opendaylight_port'),
160 if count(hiera('ntp::servers')) > 0 {
163 @@ -242,10 +249,45 @@ if hiera('step') >= 3 {
164 tenant_network_types => [hiera('neutron_tenant_network_type')],
165 mechanism_drivers => [hiera('neutron_mechanism_drivers')],
167 - class { 'neutron::agents::ml2::ovs':
168 - bridge_mappings => split(hiera('neutron_bridge_mappings'), ','),
169 - tunnel_types => split(hiera('neutron_tunnel_types'), ','),
171 + if 'opendaylight' in hiera('neutron_mechanism_drivers') {
173 + $opendaylight_port = hiera('opendaylight_port')
174 + $private_ip = hiera('neutron::agents::ml2::ovs::local_ip')
176 + neutron_plugin_ml2 {
177 + 'ml2_odl/username': value => 'admin';
178 + 'ml2_odl/password': value => 'admin';
179 + 'ml2_odl/url': value => "http://${controller_node_ips[0]}:${opendaylight_port}/controller/nb/v2/neutron";
182 + exec { 'Wait for NetVirt OVSDB to come up':
183 + command => "/bin/curl -o /dev/null --fail --silent --head -u admin:admin \
184 + http://${controller_node_ips[0]}:${opendaylight_port}/restconf/operational/network-topology:network-topology",
189 + exec { 'Set OVS Manager to OpenDaylight':
190 + command => "/usr/bin/ovs-vsctl set-manager tcp:${controller_node_ips[0]}:6640",
191 + unless => "/usr/bin/ovs-vsctl show | /usr/bin/grep 'Manager \"tcp:${controller_node_ips[0]}:6640\"'",
194 + exec { 'Set local_ip Other Option':
195 + command => "/usr/bin/ovs-vsctl set Open_vSwitch $(ovs-vsctl get Open_vSwitch . _uuid) other_config:local_ip=$private_ip",
196 + unless => "/usr/bin/ovs-vsctl list Open_vSwitch | /usr/bin/grep 'local_ip=\"$private_ip\"'",
201 + class { 'neutron::agents::ml2::ovs':
202 + bridge_mappings => split(hiera('neutron_bridge_mappings'), ','),
203 + tunnel_types => split(hiera('neutron_tunnel_types'), ','),
206 + Service['neutron-server'] -> Service['neutron-ovs-agent-service']
209 if 'cisco_n1kv' in hiera('neutron_mechanism_drivers') {
210 include neutron::plugins::ml2::cisco::nexus1000v
212 @@ -281,7 +323,6 @@ if hiera('step') >= 3 {
214 Service['neutron-server'] -> Service['neutron-dhcp-service']
215 Service['neutron-server'] -> Service['neutron-l3']
216 - Service['neutron-server'] -> Service['neutron-ovs-agent-service']
217 Service['neutron-server'] -> Service['neutron-metadata']
220 diff --git a/puppet/manifests/overcloud_controller_pacemaker.pp b/puppet/manifests/overcloud_controller_pacemaker.pp
221 index b8fa89f..9911285 100644
222 --- a/puppet/manifests/overcloud_controller_pacemaker.pp
223 +++ b/puppet/manifests/overcloud_controller_pacemaker.pp
224 @@ -380,6 +380,13 @@ if hiera('step') >= 2 {
228 + if 'opendaylight' in hiera('neutron_mechanism_drivers') {
229 + class {"opendaylight":
230 + extra_features => ['odl-ovsdb-openstack', 'odl-dlux-core', 'odl-sfc-core', 'odl-sfc-ui', 'odl-sfc-sb-rest', 'odl-sfc-ovs', 'odl-sfc-netconf', 'odl-sfclisp', 'odl-sfcofl2'],
231 + odl_rest_port => hiera('opendaylight_port'),
235 exec { 'galera-ready' :
236 command => '/usr/bin/clustercheck >/dev/null',
238 @@ -604,13 +611,42 @@ if hiera('step') >= 3 {
239 tenant_network_types => [hiera('neutron_tenant_network_type')],
240 mechanism_drivers => [hiera('neutron_mechanism_drivers')],
242 - class { 'neutron::agents::ml2::ovs':
243 - manage_service => false,
245 - bridge_mappings => split(hiera('neutron_bridge_mappings'), ','),
246 - tunnel_types => split(hiera('neutron_tunnel_types'), ','),
248 + if 'opendaylight' in hiera('neutron_mechanism_drivers') {
250 + $opendaylight_port = hiera('opendaylight_port')
251 + $private_ip = hiera('neutron::agents::ml2::ovs::local_ip')
253 + neutron_plugin_ml2 {
254 + 'ml2_odl/username': value => 'admin';
255 + 'ml2_odl/password': value => 'admin';
256 + 'ml2_odl/url': value => "http://${controller_node_ips[0]}:${opendaylight_port}/controller/nb/v2/neutron";
259 + exec { 'Wait for NetVirt OVSDB to come up':
260 + command => "/bin/curl -o /dev/null --fail --silent --head -u admin:admin \
261 + http://${controller_node_ips[0]}:${opendaylight_port}/restconf/operational/network-topology:network-topology",
266 + exec { 'Set OVS Manager to OpenDaylight':
267 + command => "/usr/bin/ovs-vsctl set-manager tcp:${controller_node_ips[0]}:6640",
268 + unless => "/usr/bin/ovs-vsctl show | /usr/bin/grep 'Manager \"tcp:${controller_node_ips[0]}:6640\"'",
271 + exec { 'Set local_ip Other Option':
272 + command => "/usr/bin/ovs-vsctl set Open_vSwitch $(ovs-vsctl get Open_vSwitch . _uuid) other_config:local_ip=$private_ip",
273 + unless => "/usr/bin/ovs-vsctl list Open_vSwitch | /usr/bin/grep 'local_ip=\"$private_ip\"'",
277 + class { 'neutron::agents::ml2::ovs':
278 + manage_service => false,
280 + bridge_mappings => split(hiera('neutron_bridge_mappings'), ','),
281 + tunnel_types => split(hiera('neutron_tunnel_types'), ','),
284 if 'cisco_ucsm' in hiera('neutron_mechanism_drivers') {
285 include ::neutron::plugins::ml2::cisco::ucsm
287 @@ -1059,56 +1095,13 @@ if hiera('step') >= 4 {
288 pacemaker::resource::service { $::neutron::params::dhcp_agent_service:
289 clone_params => "interleave=true",
291 - pacemaker::resource::service { $::neutron::params::ovs_agent_service:
292 - clone_params => "interleave=true",
294 pacemaker::resource::service { $::neutron::params::metadata_agent_service:
295 clone_params => "interleave=true",
297 - pacemaker::resource::ocf { $::neutron::params::ovs_cleanup_service:
298 - ocf_agent_name => "neutron:OVSCleanup",
299 - clone_params => "interleave=true",
301 pacemaker::resource::ocf { 'neutron-netns-cleanup':
302 ocf_agent_name => "neutron:NetnsCleanup",
303 clone_params => "interleave=true",
306 - # neutron - one chain ovs-cleanup-->netns-cleanup-->ovs-agent
307 - pacemaker::constraint::base { 'neutron-ovs-cleanup-to-netns-cleanup-constraint':
308 - constraint_type => "order",
309 - first_resource => "${::neutron::params::ovs_cleanup_service}-clone",
310 - second_resource => "neutron-netns-cleanup-clone",
311 - first_action => "start",
312 - second_action => "start",
313 - require => [Pacemaker::Resource::Ocf["${::neutron::params::ovs_cleanup_service}"],
314 - Pacemaker::Resource::Ocf['neutron-netns-cleanup']],
316 - pacemaker::constraint::colocation { 'neutron-ovs-cleanup-to-netns-cleanup-colocation':
317 - source => "neutron-netns-cleanup-clone",
318 - target => "${::neutron::params::ovs_cleanup_service}-clone",
319 - score => "INFINITY",
320 - require => [Pacemaker::Resource::Ocf["${::neutron::params::ovs_cleanup_service}"],
321 - Pacemaker::Resource::Ocf['neutron-netns-cleanup']],
323 - pacemaker::constraint::base { 'neutron-netns-cleanup-to-openvswitch-agent-constraint':
324 - constraint_type => "order",
325 - first_resource => "neutron-netns-cleanup-clone",
326 - second_resource => "${::neutron::params::ovs_agent_service}-clone",
327 - first_action => "start",
328 - second_action => "start",
329 - require => [Pacemaker::Resource::Ocf["neutron-netns-cleanup"],
330 - Pacemaker::Resource::Service["${::neutron::params::ovs_agent_service}"]],
332 - pacemaker::constraint::colocation { 'neutron-netns-cleanup-to-openvswitch-agent-colocation':
333 - source => "${::neutron::params::ovs_agent_service}-clone",
334 - target => "neutron-netns-cleanup-clone",
335 - score => "INFINITY",
336 - require => [Pacemaker::Resource::Ocf["neutron-netns-cleanup"],
337 - Pacemaker::Resource::Service["${::neutron::params::ovs_agent_service}"]],
340 - #another chain keystone-->neutron-server-->ovs-agent-->dhcp-->l3
341 pacemaker::constraint::base { 'keystone-to-neutron-server-constraint':
342 constraint_type => "order",
343 first_resource => "${::keystone::params::service_name}-clone",
344 @@ -1118,31 +1111,75 @@ if hiera('step') >= 4 {
345 require => [Pacemaker::Resource::Service[$::keystone::params::service_name],
346 Pacemaker::Resource::Service[$::neutron::params::server_service]],
348 - pacemaker::constraint::base { 'neutron-server-to-openvswitch-agent-constraint':
349 - constraint_type => "order",
350 - first_resource => "${::neutron::params::server_service}-clone",
351 - second_resource => "${::neutron::params::ovs_agent_service}-clone",
352 - first_action => "start",
353 - second_action => "start",
354 - require => [Pacemaker::Resource::Service[$::neutron::params::server_service],
355 - Pacemaker::Resource::Service[$::neutron::params::ovs_agent_service]],
357 - pacemaker::constraint::base { 'neutron-openvswitch-agent-to-dhcp-agent-constraint':
358 - constraint_type => "order",
359 - first_resource => "${::neutron::params::ovs_agent_service}-clone",
360 - second_resource => "${::neutron::params::dhcp_agent_service}-clone",
361 - first_action => "start",
362 - second_action => "start",
363 - require => [Pacemaker::Resource::Service["${::neutron::params::ovs_agent_service}"],
364 - Pacemaker::Resource::Service["${::neutron::params::dhcp_agent_service}"]],
365 + if 'openvswitch' in hiera('neutron_mechanism_drivers') {
366 + pacemaker::resource::service { $::neutron::params::ovs_agent_service:
367 + clone_params => "interleave=true",
369 + pacemaker::resource::ocf { $::neutron::params::ovs_cleanup_service:
370 + ocf_agent_name => "neutron:OVSCleanup",
371 + clone_params => "interleave=true",
373 + # neutron - one chain ovs-cleanup-->netns-cleanup-->ovs-agent
374 + pacemaker::constraint::base { 'neutron-ovs-cleanup-to-netns-cleanup-constraint':
375 + constraint_type => "order",
376 + first_resource => "${::neutron::params::ovs_cleanup_service}-clone",
377 + second_resource => "neutron-netns-cleanup-clone",
378 + first_action => "start",
379 + second_action => "start",
380 + require => [Pacemaker::Resource::Ocf["${::neutron::params::ovs_cleanup_service}"],
381 + Pacemaker::Resource::Ocf['neutron-netns-cleanup']],
383 + pacemaker::constraint::colocation { 'neutron-ovs-cleanup-to-netns-cleanup-colocation':
384 + source => "neutron-netns-cleanup-clone",
385 + target => "${::neutron::params::ovs_cleanup_service}-clone",
386 + score => "INFINITY",
387 + require => [Pacemaker::Resource::Ocf["${::neutron::params::ovs_cleanup_service}"],
388 + Pacemaker::Resource::Ocf['neutron-netns-cleanup']],
390 + pacemaker::constraint::base { 'neutron-netns-cleanup-to-openvswitch-agent-constraint':
391 + constraint_type => "order",
392 + first_resource => "neutron-netns-cleanup-clone",
393 + second_resource => "${::neutron::params::ovs_agent_service}-clone",
394 + first_action => "start",
395 + second_action => "start",
396 + require => [Pacemaker::Resource::Ocf["neutron-netns-cleanup"],
397 + Pacemaker::Resource::Service["${::neutron::params::ovs_agent_service}"]],
399 + pacemaker::constraint::colocation { 'neutron-netns-cleanup-to-openvswitch-agent-colocation':
400 + source => "${::neutron::params::ovs_agent_service}-clone",
401 + target => "neutron-netns-cleanup-clone",
402 + score => "INFINITY",
403 + require => [Pacemaker::Resource::Ocf["neutron-netns-cleanup"],
404 + Pacemaker::Resource::Service["${::neutron::params::ovs_agent_service}"]],
408 - pacemaker::constraint::colocation { 'neutron-openvswitch-agent-to-dhcp-agent-colocation':
409 - source => "${::neutron::params::dhcp_agent_service}-clone",
410 - target => "${::neutron::params::ovs_agent_service}-clone",
411 - score => "INFINITY",
412 - require => [Pacemaker::Resource::Service["${::neutron::params::ovs_agent_service}"],
413 - Pacemaker::Resource::Service["${::neutron::params::dhcp_agent_service}"]],
414 + #another chain keystone-->neutron-server-->ovs-agent-->dhcp-->l3
415 + pacemaker::constraint::base { 'neutron-server-to-openvswitch-agent-constraint':
416 + constraint_type => "order",
417 + first_resource => "${::neutron::params::server_service}-clone",
418 + second_resource => "${::neutron::params::ovs_agent_service}-clone",
419 + first_action => "start",
420 + second_action => "start",
421 + require => [Pacemaker::Resource::Service[$::neutron::params::server_service],
422 + Pacemaker::Resource::Service[$::neutron::params::ovs_agent_service]],
424 + pacemaker::constraint::base { 'neutron-openvswitch-agent-to-dhcp-agent-constraint':
425 + constraint_type => "order",
426 + first_resource => "${::neutron::params::ovs_agent_service}-clone",
427 + second_resource => "${::neutron::params::dhcp_agent_service}-clone",
428 + first_action => "start",
429 + second_action => "start",
430 + require => [Pacemaker::Resource::Service["${::neutron::params::ovs_agent_service}"],
431 + Pacemaker::Resource::Service["${::neutron::params::dhcp_agent_service}"]],
434 + pacemaker::constraint::colocation { 'neutron-openvswitch-agent-to-dhcp-agent-colocation':
435 + source => "${::neutron::params::dhcp_agent_service}-clone",
436 + target => "${::neutron::params::ovs_agent_service}-clone",
437 + score => "INFINITY",
438 + require => [Pacemaker::Resource::Service["${::neutron::params::ovs_agent_service}"],
439 + Pacemaker::Resource::Service["${::neutron::params::dhcp_agent_service}"]],
442 pacemaker::constraint::base { 'neutron-dhcp-agent-to-l3-agent-constraint':
443 constraint_type => "order",