adding build deps that have had to be installed manually
[apex.git] / build / opendaylight.patch
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
5
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)
9
10 Change-Id: I2a4c5b69ee0ad70d2372cad23b9af0890715c85f
11 Signed-off-by: Dan Radez <dradez@redhat.com>
12 ---
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
21
22 diff --git a/environments/opendaylight.yaml b/environments/opendaylight.yaml
23 new file mode 100644
24 index 0000000..39e4aa3
25 --- /dev/null
26 +++ b/environments/opendaylight.yaml
27 @@ -0,0 +1,4 @@
28 +parameters:
29 +    ExtraConfig:
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:
37    NtpServer:
38      type: string
39      default: ''
40 +  OpenDaylightPort:
41 +    default: 8081
42 +    description: Set opendaylight service port
43 +    type: number
44    RabbitHost:
45      type: string
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}
57                - ':'
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:
68    NtpServer:
69      type: string
70      default: ''
71 +  OpenDaylightPort:
72 +    default: 8081
73 +    description: Set opendaylight service port
74 +    type: number
75    PcsdPassword:
76      type: string
77      description: The password for the 'pcsd' user.
78 @@ -794,6 +798,7 @@ resources:
79              template: tripleo-CLUSTER
80              params:
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}
89  
90 +                # OpenDaylight
91 +                opendaylight_port: {get_input: opendaylight_port}
92 +
93                  # Neutron
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 {
101    include ::ntp
102  }
103  
104 +$controller_node_ips = split(hiera('controller_node_ips'), ',')
105 +
106  file { ['/etc/libvirt/qemu/networks/autostart/default.xml',
107          '/etc/libvirt/qemu/networks/default.xml']:
108    ensure => absent,
109 @@ -74,9 +76,32 @@ class { 'neutron::plugins::ml2':
110    tenant_network_types => [hiera('neutron_tenant_network_type')],
111  }
112  
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')
119 +
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",
123 +    tries     => 20,
124 +    try_sleep => 60,
125 +  } ->
126 +  # OVS manager
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\"'",
130 +  } ->
131 +  # local ip
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\"'",
135 +  }
136 +
137 +} else {
138 +  class { 'neutron::agents::ml2::ovs':
139 +    bridge_mappings => split(hiera('neutron_bridge_mappings'), ','),
140 +    tunnel_types    => split(hiera('neutron_tunnel_types'), ','),
141 +  }
142  }
143  
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 {
150  
151  if hiera('step') >= 2 {
152  
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'),
157 +    }
158 +  }
159 +
160    if count(hiera('ntp::servers')) > 0 {
161      include ::ntp
162    }
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')],
166    }
167 -  class { 'neutron::agents::ml2::ovs':
168 -    bridge_mappings => split(hiera('neutron_bridge_mappings'), ','),
169 -    tunnel_types => split(hiera('neutron_tunnel_types'), ','),
170 +
171 +  if 'opendaylight' in hiera('neutron_mechanism_drivers') {
172 +
173 +    $opendaylight_port = hiera('opendaylight_port')
174 +    $private_ip = hiera('neutron::agents::ml2::ovs::local_ip')
175 +
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";
180 +    }
181 +
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",
185 +      tries     => 20,
186 +      try_sleep => 60,
187 +    } ->
188 +    # OVS manager
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\"'",
192 +    } ->
193 +    # local ip
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\"'",
197 +    }
198 +
199 +  } else {
200 +
201 +    class { 'neutron::agents::ml2::ovs':
202 +      bridge_mappings => split(hiera('neutron_bridge_mappings'), ','),
203 +      tunnel_types => split(hiera('neutron_tunnel_types'), ','),
204 +    }
205 +
206 +    Service['neutron-server'] -> Service['neutron-ovs-agent-service']
207    }
208 +
209    if 'cisco_n1kv' in hiera('neutron_mechanism_drivers') {
210      include neutron::plugins::ml2::cisco::nexus1000v
211  
212 @@ -281,7 +323,6 @@ if hiera('step') >= 3 {
213  
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']
218  
219    include ::cinder
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 {
225  
226    }
227  
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'),
232 +    }
233 +  }
234 +
235    exec { 'galera-ready' :
236      command     => '/usr/bin/clustercheck >/dev/null',
237      timeout     => 30,
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')],
241    }
242 -  class { 'neutron::agents::ml2::ovs':
243 -    manage_service   => false,
244 -    enabled          => false,
245 -    bridge_mappings  => split(hiera('neutron_bridge_mappings'), ','),
246 -    tunnel_types     => split(hiera('neutron_tunnel_types'), ','),
247 -  }
248 +  if 'opendaylight' in hiera('neutron_mechanism_drivers') {
249 +
250 +    $opendaylight_port = hiera('opendaylight_port')
251 +    $private_ip = hiera('neutron::agents::ml2::ovs::local_ip')
252 +
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";
257 +    }
258  
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",
262 +      tries     => 20,
263 +      try_sleep => 60,
264 +    } ->
265 +    # OVS manager
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\"'",
269 +    } ->
270 +    # local ip
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\"'",
274 +    }
275 +
276 +  } else {
277 +    class { 'neutron::agents::ml2::ovs':
278 +      manage_service   => false,
279 +      enabled          => false,
280 +      bridge_mappings  => split(hiera('neutron_bridge_mappings'), ','),
281 +      tunnel_types     => split(hiera('neutron_tunnel_types'), ','),
282 +    }
283 +  }
284    if 'cisco_ucsm' in hiera('neutron_mechanism_drivers') {
285      include ::neutron::plugins::ml2::cisco::ucsm
286    }
287 @@ -1059,56 +1095,13 @@ if hiera('step') >= 4 {
288      pacemaker::resource::service { $::neutron::params::dhcp_agent_service:
289        clone_params   => "interleave=true",
290      }
291 -    pacemaker::resource::service { $::neutron::params::ovs_agent_service:
292 -      clone_params => "interleave=true",
293 -    }
294      pacemaker::resource::service { $::neutron::params::metadata_agent_service:
295        clone_params => "interleave=true",
296      }
297 -    pacemaker::resource::ocf { $::neutron::params::ovs_cleanup_service:
298 -      ocf_agent_name => "neutron:OVSCleanup",
299 -      clone_params => "interleave=true",
300 -    }
301      pacemaker::resource::ocf { 'neutron-netns-cleanup':
302        ocf_agent_name => "neutron:NetnsCleanup",
303        clone_params => "interleave=true",
304      }
305 -
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']],
315 -    }
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']],
322 -    }
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}"]],
331 -    }
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}"]],
338 -    }
339 -
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]],
347      }
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]],
356 -    }
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",
368 +      }
369 +      pacemaker::resource::ocf { $::neutron::params::ovs_cleanup_service:
370 +        ocf_agent_name => "neutron:OVSCleanup",
371 +        clone_params => "interleave=true",
372 +      }
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']],
382 +      }
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']],
389 +      }
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}"]],
398 +      }
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}"]],
405 +      }
406  
407 -    }
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]],
423 +      }
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}"]],
432 +
433 +      }
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}"]],
440 +      }
441      }
442      pacemaker::constraint::base { 'neutron-dhcp-agent-to-l3-agent-constraint':
443        constraint_type => "order",
444 -- 
445 2.5.0
446