1 From 3bdd51fc8aa137e65422d6b1f5b0ddc4391b3201 Mon Sep 17 00:00:00 2001
2 From: Tim Rozet <tdrozet@gmail.com>
3 Date: Tue, 12 Jan 2016 16:49:57 -0500
4 Subject: [PATCH] Adds current opnfv patch with ODL and ONOS support
7 environments/onos.yaml | 8 +
8 environments/opendaylight-external.yaml | 25 ++
9 environments/opendaylight.yaml | 25 ++
10 environments/opendaylight_l3.yaml | 9 +
11 network/endpoints/endpoint_map.yaml | 31 ++
12 overcloud-resource-registry-puppet.yaml | 3 +
13 overcloud-without-mergepy.yaml | 87 +++++
14 puppet/all-nodes-config.yaml | 16 +
15 puppet/compute.yaml | 35 ++
16 puppet/controller.yaml | 84 +++++
17 puppet/hieradata/common.yaml | 1 +
18 puppet/hieradata/controller.yaml | 3 +
19 puppet/manifests/overcloud_compute.pp | 33 +-
20 puppet/manifests/overcloud_controller.pp | 104 +++++-
21 puppet/manifests/overcloud_controller_pacemaker.pp | 385 +++++++++++++++------
22 puppet/manifests/overcloud_opendaylight.pp | 27 ++
23 puppet/opendaylight-puppet.yaml | 217 ++++++++++++
24 17 files changed, 968 insertions(+), 125 deletions(-)
25 create mode 100644 environments/onos.yaml
26 create mode 100644 environments/opendaylight-external.yaml
27 create mode 100644 environments/opendaylight.yaml
28 create mode 100644 environments/opendaylight_l3.yaml
29 create mode 100644 puppet/manifests/overcloud_opendaylight.pp
30 create mode 100644 puppet/opendaylight-puppet.yaml
32 diff --git a/environments/onos.yaml b/environments/onos.yaml
34 index 0000000..510aca9
36 +++ b/environments/onos.yaml
39 + #This a bug for odl deployment. Once bug fixed OpenDaylightCount can be remove.
40 + OpenDaylightCount: 0
43 + neutron_service_plugins: ['onos_router']
44 + neutron_mechanism_drivers: ['onos_ml2']
45 + neutron_tenant_network_type: vxlan
46 diff --git a/environments/opendaylight-external.yaml b/environments/opendaylight-external.yaml
48 index 0000000..411df21
50 +++ b/environments/opendaylight-external.yaml
52 +# Environment file used to enable OpenDaylight
53 +# Currently uses overcloud image that is assumed
54 +# to be virt-customized with ODL RPM already on it
56 +# These parameters customize the OpenDaylight Node
57 +# The user name and password are for the ODL service
58 +# Defaults are included here for reference
60 +# OpenDaylightFlavor: baremetal
61 +# OpenDaylightHostname: opendaylight-server
62 +# OpenDaylightImage: overcloud-full
63 +# OpenDaylightUsername: admin
64 +# OpenDaylightPassword: admin
67 + # increase this if you need more ODL nodes
68 + OpenDaylightCount: 1
71 + neutron_mechanism_drivers: ['opendaylight']
72 + neutron_tenant_network_type: vxlan
73 + # Enable this if you want OpenDaylight on the contollers
74 + # reduce OpenDaylightCount to 0 if you don't want any
75 + # OpenDaylight only nodes
76 + #opendaylight_install: true
77 diff --git a/environments/opendaylight.yaml b/environments/opendaylight.yaml
79 index 0000000..c8abf75
81 +++ b/environments/opendaylight.yaml
83 +# Environment file used to enable OpenDaylight
84 +# Currently uses overcloud image that is assumed
85 +# to be virt-customized with ODL RPM already on it
87 +# These parameters customize the OpenDaylight Node
88 +# The user name and password are for the ODL service
89 +# Defaults are included here for reference
91 +# OpenDaylightFlavor: baremetal
92 +# OpenDaylightHostname: opendaylight-server
93 +# OpenDaylightImage: overcloud-full
94 +# OpenDaylightUsername: admin
95 +# OpenDaylightPassword: admin
98 + # increase this if you need more ODL nodes
99 + # OpenDaylightCount: 1
102 + neutron_mechanism_drivers: ['opendaylight']
103 + neutron_tenant_network_type: vxlan
104 + # Enable this if you want OpenDaylight on the contollers
105 + # reduce OpenDaylightCount to 0 if you don't want any
106 + # OpenDaylight only nodes
107 + opendaylight_install: true
108 diff --git a/environments/opendaylight_l3.yaml b/environments/opendaylight_l3.yaml
110 index 0000000..ffdb017
112 +++ b/environments/opendaylight_l3.yaml
115 + #NeutronEnableL3Agent: false
116 + NeutronEnableForceMetadata: true
117 + OpenDaylightEnableL3: "'yes'"
118 + NeutronServicePlugins: "networking_odl.l3.l3_odl.OpenDaylightL3RouterPlugin"
120 + neutron_mechanism_drivers: ['opendaylight']
121 + neutron_tenant_network_type: vxlan
122 + opendaylight_install: true
123 diff --git a/network/endpoints/endpoint_map.yaml b/network/endpoints/endpoint_map.yaml
124 index 0521401..7caa91b 100644
125 --- a/network/endpoints/endpoint_map.yaml
126 +++ b/network/endpoints/endpoint_map.yaml
127 @@ -4,6 +4,9 @@ description: >
128 A Map of OpenStack Endpoints
134 CeilometerApiVirtualIP:
137 @@ -43,6 +46,9 @@ parameters:
141 + AodhAdmin: {protocol: 'http', port: '8042', host: 'IP_ADDRESS'}
142 + AodhInternal: {protocol: 'http', port: '8042', host: 'IP_ADDRESS'}
143 + AodhPublic: {protocol: 'http', port: '8042', host: 'IP_ADDRESS'}
144 CeilometerAdmin: {protocol: 'http', port: '8777', host: 'IP_ADDRESS'}
145 CeilometerInternal: {protocol: 'http', port: '8777', host: 'IP_ADDRESS'}
146 CeilometerPublic: {protocol: 'http', port: '8777', host: 'IP_ADDRESS'}
147 @@ -83,6 +89,28 @@ parameters:
152 + type: OS::TripleO::Endpoint
154 + EndpointName: AodhInternal
155 + EndpointMap: { get_param: EndpointMap }
156 + CloudName: {get_param: CloudName}
157 + IP: {get_param: AodhApiVirtualIP}
159 + type: OS::TripleO::Endpoint
161 + EndpointName: AodhPublic
162 + EndpointMap: { get_param: EndpointMap }
163 + CloudName: {get_param: CloudName}
164 + IP: {get_param: PublicVirtualIP}
166 + type: OS::TripleO::Endpoint
168 + EndpointName: AodhAdmin
169 + EndpointMap: { get_param: EndpointMap }
170 + CloudName: {get_param: CloudName}
171 + IP: {get_param: AodhApiVirtualIP}
174 type: OS::TripleO::Endpoint
176 @@ -407,6 +435,9 @@ resources:
180 + AodhInternal: {get_attr: [ AodhInternal, endpoint] }
181 + AodhPublic: {get_attr: [ AodhPublic, endpoint] }
182 + AodhAdmin: {get_attr: [ AodhAdmin, endpoint] }
183 CeilometerInternal: {get_attr: [ CeilometerInternal, endpoint] }
184 CeilometerPublic: {get_attr: [ CeilometerPublic, endpoint] }
185 CeilometerAdmin: {get_attr: [ CeilometerAdmin, endpoint] }
186 diff --git a/overcloud-resource-registry-puppet.yaml b/overcloud-resource-registry-puppet.yaml
187 index 4cfed6b..adecc79 100644
188 --- a/overcloud-resource-registry-puppet.yaml
189 +++ b/overcloud-resource-registry-puppet.yaml
190 @@ -27,6 +27,9 @@ resource_registry:
191 # To disable, replace with firstboot/userdata_default.yaml
192 OS::TripleO::NodeAdminUserData: firstboot/userdata_heat_admin.yaml
194 + # This configures OpenDaylight to drive the network
195 + OS::TripleO::OpenDaylightNode: puppet/opendaylight-puppet.yaml
197 # Hooks for operator extra config
198 # NodeUserData == Cloud-init additional user-data, e.g cloud-config
199 # ControllerExtraConfigPre == Controller configuration pre service deployment
200 diff --git a/overcloud-without-mergepy.yaml b/overcloud-without-mergepy.yaml
201 index a532c2f..5206004 100644
202 --- a/overcloud-without-mergepy.yaml
203 +++ b/overcloud-without-mergepy.yaml
204 @@ -15,6 +15,11 @@ parameters:
205 description: The password for the keystone admin account, used for monitoring, querying neutron etc.
210 + description: The password for the aodh services
215 description: The ceilometer backend type.
216 @@ -113,6 +118,10 @@ parameters:
219 description: Neutron ID for ctlplane network.
220 + NeutronEnableForceMetadata:
222 + description: If True, DHCP always provides metadata route to VM.
224 NeutronEnableTunnelling:
227 @@ -227,6 +236,27 @@ parameters:
229 description: Should MongoDb journaling be disabled
233 + description: Set opendaylight service port
235 + OpenDaylightEnableL3:
236 + description: Knob to enable/disable ODL L3
239 + OpenDaylightInstall:
241 + description: Whether to install OpenDaylight on the control nodes.
243 + OpenDaylightUsername:
245 + description: The username for the opendaylight server.
247 + OpenDaylightPassword:
250 + description: The password for the opendaylight server.
252 PublicVirtualFixedIPs:
255 @@ -575,6 +605,7 @@ parameters:
257 NeutronTenantNetwork: tenant
258 CeilometerApiNetwork: internal_api
259 + AodhApiNetwork: internal_api
260 MongoDbNetwork: internal_api
261 CinderApiNetwork: internal_api
262 CinderIscsiNetwork: storage
263 @@ -664,6 +695,18 @@ parameters:
264 structure as ExtraConfig.
267 +# OpenDaylight specific parameters
272 + default: overcloud-full
274 + OpenDaylightFlavor:
276 + description: Flavor for OpenDaylight node
279 # Hostname format for each role
280 # Note %index% is translated into the index of the node, e.g 0/1/2 etc
281 # and %stackname% is replaced with OS::stack_name in the template below.
282 @@ -688,6 +731,10 @@ parameters:
284 description: Format for CephStorage node hostnames
285 default: '%stackname%-cephstorage-%index%'
286 + OpenDaylightHostnameFormat:
288 + description: Format for OpenDaylight node hostnames
289 + default: '%stackname%-opendaylight-%index%'
291 # Identifiers to trigger tasks on nodes
293 @@ -758,6 +805,7 @@ resources:
295 CloudName: {get_param: CloudName}
296 CeilometerApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
297 + AodhApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
298 CinderApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
299 GlanceApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
300 GlanceRegistryVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
301 @@ -770,6 +818,28 @@ resources:
302 SwiftProxyVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
303 PublicVirtualIP: {get_attr: [VipMap, net_ip_map, external]}
306 + type: OS::Heat::ResourceGroup
307 + depends_on: Networks
309 + count: {get_param: OpenDaylightCount}
310 + removal_policies: {get_param: ComputeRemovalPolicies}
312 + type: OS::TripleO::OpenDaylightNode
314 + UpdateIdentifier: {get_param: UpdateIdentifier}
315 + OpenDaylightFlavor: {get_param: OpenDaylightFlavor}
316 + OpenDaylightImage: {get_param: OpenDaylightImage}
317 + OpenDaylightPort: {get_param: OpenDaylightPort}
318 + OpenDaylightUsername: {get_param: OpenDaylightUsername}
319 + OpenDaylightPassword: {get_param: OpenDaylightPassword}
320 + OpenDaylightEnableL3: {get_param: OpenDaylightEnableL3}
321 + OpenDaylightHostname:
323 + template: {get_param: OpenDaylightHostnameFormat}
325 + '%stackname%': {get_param: 'OS::stack_name'}
328 type: OS::Heat::ResourceGroup
330 @@ -781,6 +851,7 @@ resources:
332 AdminPassword: {get_param: AdminPassword}
333 AdminToken: {get_param: AdminToken}
334 + AodhPassword: {get_param: AodhPassword}
335 CeilometerBackend: {get_param: CeilometerBackend}
336 CeilometerMeteringSecret: {get_param: CeilometerMeteringSecret}
337 CeilometerPassword: {get_param: CeilometerPassword}
338 @@ -832,6 +903,7 @@ resources:
339 NeutronBridgeMappings: {get_param: NeutronBridgeMappings}
340 NeutronExternalNetworkBridge: {get_param: NeutronExternalNetworkBridge}
341 NeutronEnableTunnelling: {get_param: NeutronEnableTunnelling}
342 + NeutronEnableForceMetadata: {get_param: NeutronEnableForceMetadata}
343 NeutronNetworkVLANRanges: {get_param: NeutronNetworkVLANRanges}
344 NeutronPublicInterface: {get_param: NeutronPublicInterface}
345 NeutronPublicInterfaceDefaultRoute: {get_param: NeutronPublicInterfaceDefaultRoute}
346 @@ -853,6 +925,11 @@ resources:
347 NovaPassword: {get_param: NovaPassword}
348 NtpServer: {get_param: NtpServer}
349 MongoDbNoJournal: {get_param: MongoDbNoJournal}
350 + OpenDaylightPort: {get_param: OpenDaylightPort}
351 + OpenDaylightInstall: {get_param: OpenDaylightInstall}
352 + OpenDaylightUsername: {get_param: OpenDaylightUsername}
353 + OpenDaylightPassword: {get_param: OpenDaylightPassword}
354 + OpenDaylightEnableL3: {get_param: OpenDaylightEnableL3}
355 PcsdPassword: {get_resource: PcsdPassword}
356 PublicVirtualInterface: {get_param: PublicVirtualInterface}
357 RabbitPassword: {get_param: RabbitPassword}
358 @@ -878,6 +955,7 @@ resources:
359 ServiceNetMap: {get_param: ServiceNetMap}
360 EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
361 CeilometerApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
362 + AodhApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
363 CinderApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
364 HeatApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
365 GlanceApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
366 @@ -948,6 +1026,9 @@ resources:
367 NovaPublicIP: {get_attr: [PublicVirtualIP, ip_address]}
368 NovaPassword: {get_param: NovaPassword}
369 NtpServer: {get_param: NtpServer}
370 + OpenDaylightPort: {get_param: OpenDaylightPort}
371 + OpenDaylightUsername: {get_param: OpenDaylightUsername}
372 + OpenDaylightPassword: {get_param: OpenDaylightPassword}
373 RabbitHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
374 RabbitPassword: {get_param: RabbitPassword}
375 RabbitUserName: {get_param: RabbitUserName}
376 @@ -1068,6 +1149,7 @@ resources:
377 compute_hosts: {get_attr: [Compute, hosts_entry]}
378 controller_hosts: {get_attr: [Controller, hosts_entry]}
379 controller_ips: {get_attr: [Controller, ip_address]}
380 + opendaylight_ip: {get_attr: [OpenDaylightNode, ip_address]}
381 block_storage_hosts: {get_attr: [BlockStorage, hosts_entry]}
382 object_storage_hosts: {get_attr: [ObjectStorage, hosts_entry]}
383 ceph_storage_hosts: {get_attr: [CephStorage, hosts_entry]}
384 @@ -1081,6 +1163,7 @@ resources:
385 heat_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
386 swift_proxy_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
387 ceilometer_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
388 + aodh_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
389 nova_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
390 nova_metadata_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
391 glance_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
392 @@ -1189,6 +1272,7 @@ resources:
393 nova_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
394 nova_metadata_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
395 ceilometer_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
396 + aodh_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
397 heat_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
398 horizon_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
399 redis_vip: {get_attr: [RedisVirtualIP, ip_address]}
400 @@ -1434,6 +1518,9 @@ outputs:
402 description: Controller VIP for public API endpoints
403 value: {get_attr: [PublicVirtualIP, ip_address]}
405 + description: VIP for Aodh API internal endpoint
406 + value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
407 CeilometerInternalVip:
408 description: VIP for Ceilometer API internal endpoint
409 value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
410 diff --git a/puppet/all-nodes-config.yaml b/puppet/all-nodes-config.yaml
411 index 2bc519b..6342df3 100644
412 --- a/puppet/all-nodes-config.yaml
413 +++ b/puppet/all-nodes-config.yaml
414 @@ -8,6 +8,8 @@ parameters:
415 type: comma_delimited_list
417 type: comma_delimited_list
419 + type: comma_delimited_list
421 type: comma_delimited_list
422 object_storage_hosts:
423 @@ -34,6 +36,8 @@ parameters:
424 type: comma_delimited_list
425 ceilometer_api_node_ips:
426 type: comma_delimited_list
428 + type: comma_delimited_list
430 type: comma_delimited_list
431 nova_metadata_node_ips:
432 @@ -82,6 +86,10 @@ resources:
433 raw_data: {get_file: hieradata/RedHat.yaml}
436 + opendaylight_controller_ip:
439 + - {get_param: opendaylight_ip}
443 @@ -166,6 +174,14 @@ resources:
446 - {get_param: ceilometer_api_node_ips}
449 + template: "['SERVERS_LIST']"
454 + - {get_param: aodh_api_node_ips}
457 template: "['SERVERS_LIST']"
458 diff --git a/puppet/compute.yaml b/puppet/compute.yaml
459 index 70c7403..13fd4f6 100644
460 --- a/puppet/compute.yaml
461 +++ b/puppet/compute.yaml
462 @@ -213,6 +213,23 @@ parameters:
468 + description: Set opendaylight service port
470 + OpenDaylightUsername:
472 + description: The username for the opendaylight server.
474 + OpenDaylightPassword:
477 + description: The password for the opendaylight server.
481 + description: Set onos service port
485 default: '' # Has to be here because of the ignored empty value bug
486 @@ -320,6 +337,11 @@ resources:
488 ControlPlaneIP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
491 + type: OS::TripleO::Controller::Ports::ExternalPort
493 + ControlPlaneIP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
496 type: OS::TripleO::Network::Ports::NetIpMap
498 @@ -327,6 +349,7 @@ resources:
499 InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
500 StorageIp: {get_attr: [StoragePort, ip_address]}
501 TenantIp: {get_attr: [TenantPort, ip_address]}
502 + ExternalIp: {get_attr: [ExternalPort, ip_address]}
505 type: OS::TripleO::Compute::Net::SoftwareConfig
506 @@ -335,6 +358,7 @@ resources:
507 InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
508 StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
509 TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
510 + ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
513 type: OS::TripleO::SoftwareDeployment
514 @@ -406,6 +430,10 @@ resources:
515 neutron::rabbit_user: {get_input: rabbit_user}
516 neutron::rabbit_use_ssl: {get_input: rabbit_client_use_ssl}
517 neutron::rabbit_port: {get_input: rabbit_client_port}
518 + opendaylight_port: {get_input: opendaylight_port}
519 + opendaylight_username: {get_input: opendaylight_username}
520 + opendaylight_password: {get_input: opendaylight_password}
521 + onos_port: {get_input: onos_port}
522 neutron_flat_networks: {get_input: neutron_flat_networks}
523 neutron_host: {get_input: neutron_host}
524 neutron::agents::ml2::ovs::local_ip: {get_input: neutron_local_ip}
525 @@ -459,6 +487,10 @@ resources:
526 snmpd_readonly_user_name: {get_param: SnmpdReadonlyUserName}
527 snmpd_readonly_user_password: {get_param: SnmpdReadonlyUserPassword}
528 glance_api_servers: {get_param: [EndpointMap, GlanceInternal, uri]}
529 + opendaylight_port: {get_param: OpenDaylightPort}
530 + opendaylight_username: {get_param: OpenDaylightUsername}
531 + opendaylight_password: {get_param: OpenDaylightPassword}
532 + onos_port: {get_param: ONOSPort}
533 neutron_flat_networks: {get_param: NeutronFlatNetworks}
534 neutron_host: {get_param: NeutronHost}
535 neutron_local_ip: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NeutronTenantNetwork]}]}
536 @@ -570,6 +602,9 @@ outputs:
538 description: IP address of the server in the tenant network
539 value: {get_attr: [TenantPort, ip_address]}
540 + external_ip_address:
541 + description: IP address of the server in the external network
542 + value: {get_attr: [ExternalPort, ip_address]}
544 description: Hostname of the server
545 value: {get_attr: [NovaCompute, name]}
546 diff --git a/puppet/controller.yaml b/puppet/controller.yaml
547 index ea0b3af..489aa57 100644
548 --- a/puppet/controller.yaml
549 +++ b/puppet/controller.yaml
550 @@ -14,6 +14,14 @@ parameters:
551 description: The keystone auth secret and db password.
559 + description: The password for the aodh services.
562 CeilometerApiVirtualIP:
565 @@ -357,6 +365,10 @@ parameters:
567 description: Allow automatic l3-agent failover
569 + NeutronEnableForceMetadata:
571 + description: If True, DHCP always provides metadata route to VM.
573 NeutronEnableTunnelling:
576 @@ -443,6 +455,31 @@ parameters:
582 + description: Set opendaylight service port
584 + OpenDaylightInstall:
586 + description: Whether to install OpenDaylight on the control nodes.
588 + OpenDaylightUsername:
590 + description: The username for the opendaylight server.
592 + OpenDaylightPassword:
595 + description: The password for the opendaylight server.
597 + OpenDaylightEnableL3:
598 + description: Knob to enable/disable ODL L3
603 + description: Set onos service port
607 description: The password for the 'pcsd' user.
608 @@ -696,6 +733,7 @@ resources:
610 bootstack_nodeid: {get_attr: [Controller, name]}
611 neutron_enable_tunneling: {get_param: NeutronEnableTunnelling}
612 + neutron_enable_force_metadata: {get_param: NeutronEnableForceMetadata}
613 haproxy_log_address: {get_param: HAProxySyslogAddress}
614 heat.watch_server_url:
616 @@ -805,6 +843,12 @@ resources:
617 template: tripleo-CLUSTER
619 CLUSTER: {get_param: MysqlClusterUniquePart}
620 + opendaylight_port: {get_param: OpenDaylightPort}
621 + opendaylight_install: {get_param: OpenDaylightInstall}
622 + opendaylight_username: {get_param: OpenDaylightUsername}
623 + opendaylight_password: {get_param: OpenDaylightPassword}
624 + opendaylight_enable_l3: {get_param: OpenDaylightEnableL3}
625 + onos_port: {get_param: ONOSPort}
626 neutron_flat_networks: {get_param: NeutronFlatNetworks}
627 neutron_metadata_proxy_shared_secret: {get_param: NeutronMetadataProxySharedSecret}
628 neutron_agent_mode: {get_param: NeutronAgentMode}
629 @@ -879,6 +923,7 @@ resources:
630 ceilometer_backend: {get_param: CeilometerBackend}
631 ceilometer_metering_secret: {get_param: CeilometerMeteringSecret}
632 ceilometer_password: {get_param: CeilometerPassword}
633 + aodh_password: {get_param: AodhPassword}
634 ceilometer_coordination_url:
637 @@ -891,6 +936,12 @@ resources:
638 - - 'mysql://ceilometer:unset@'
639 - {get_param: MysqlVirtualIP}
641 + ceilometer_public_url: {get_param: [EndpointMap, CeilometerPublic, uri]}
642 + ceilometer_internal_url: {get_param: [EndpointMap, CeilometerInternal, uri]}
643 + ceilometer_admin_url: {get_param: [EndpointMap, CeilometerAdmin, uri]}
644 + aodh_public_url: {get_param: [EndpointMap, AodhPublic, uri]}
645 + aodh_internal_url: {get_param: [EndpointMap, AodhInternal, uri]}
646 + aodh_admin_url: {get_param: [EndpointMap, AodhAdmin, uri]}
647 snmpd_readonly_user_name: {get_param: SnmpdReadonlyUserName}
648 snmpd_readonly_user_password: {get_param: SnmpdReadonlyUserPassword}
649 nova_password: {get_param: NovaPassword}
650 @@ -948,6 +999,7 @@ resources:
651 neutron_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
652 neutron_local_ip: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NeutronTenantNetwork]}]}
653 ceilometer_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
654 + aodh_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
655 nova_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
656 nova_metadata_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
657 horizon_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
658 @@ -1136,6 +1188,16 @@ resources:
659 mysql_bind_host: {get_input: mysql_network}
660 mysql_virtual_ip: {get_input: mysql_virtual_ip}
663 + opendaylight_port: {get_input: opendaylight_port}
664 + opendaylight_install: {get_input: opendaylight_install}
665 + opendaylight_username: {get_input: opendaylight_username}
666 + opendaylight_password: {get_input: opendaylight_password}
667 + opendaylight_enable_l3: {get_input: opendaylight_enable_l3}
670 + onos_port: {get_input: onos_port}
673 neutron::bind_host: {get_input: neutron_api_network}
674 neutron::rabbit_password: {get_input: rabbit_password}
675 @@ -1152,6 +1214,7 @@ resources:
676 neutron_flat_networks: {get_input: neutron_flat_networks}
677 neutron::agents::metadata::shared_secret: {get_input: neutron_metadata_proxy_shared_secret}
678 neutron::agents::metadata::metadata_ip: {get_input: neutron_api_network}
679 + neutron::agents::dhcp::enable_force_metadata: {get_input: neutron_enable_force_metadata}
680 neutron_agent_mode: {get_input: neutron_agent_mode}
681 neutron_router_distributed: {get_input: neutron_router_distributed}
682 neutron::core_plugin: {get_input: neutron_core_plugin}
683 @@ -1198,6 +1261,27 @@ resources:
684 snmpd_readonly_user_name: {get_input: snmpd_readonly_user_name}
685 snmpd_readonly_user_password: {get_input: snmpd_readonly_user_password}
688 + aodh::rabbit_userid: {get_input: rabbit_username}
689 + aodh::rabbit_password: {get_input: rabbit_password}
690 + aodh::rabbit_use_ssl: {get_input: rabbit_client_use_ssl}
691 + aodh::rabbit_port: {get_input: rabbit_client_port}
692 + aodh::debug: {get_input: debug}
693 + aodh::wsgi::apache::ssl: false
694 + aodh::api::service_name: 'httpd'
695 + aodh::api::host: {get_input: aodh_api_network}
696 + aodh::api::keystone_password: {get_input: aodh_password}
697 + aodh::api::keystone_auth_uri: {get_input: keystone_auth_uri}
698 + aodh::api::keystone_identity_uri: {get_input: keystone_identity_uri}
699 + aodh::auth::auth_password: {get_input: aodh_password}
700 + aodh::keystone::auth::public_url: {get_input: aodh_public_url }
701 + aodh::keystone::auth::internal_url: {get_input: aodh_internal_url }
702 + aodh::keystone::auth::admin_url: {get_input: aodh_admin_url }
703 + aodh::keystone::auth::password: {get_input: aodh_password }
704 + aodh::keystone::auth::region: {get_input: keystone_region}
705 + # for a migration path from ceilometer-alarm to aodh, we use the same database & coordination
706 + aodh::evaluator::coordination_url: {get_input: ceilometer_coordination_url}
709 nova::rabbit_userid: {get_input: rabbit_username}
710 nova::rabbit_password: {get_input: rabbit_password}
711 diff --git a/puppet/hieradata/common.yaml b/puppet/hieradata/common.yaml
712 index 030f661..5840016 100644
713 --- a/puppet/hieradata/common.yaml
714 +++ b/puppet/hieradata/common.yaml
715 @@ -6,6 +6,7 @@ ceilometer::agent::auth::auth_region: 'regionOne'
716 # FIXME: Might be better to use 'service' tenant here but this requires
717 # changes in the tripleo-incubator keystone role setup
718 ceilometer::agent::auth::auth_tenant_name: 'admin'
719 +aodh::auth::auth_tenant_name: 'admin'
721 nova::network::neutron::neutron_admin_tenant_name: 'service'
722 nova::network::neutron::neutron_admin_username: 'neutron'
723 diff --git a/puppet/hieradata/controller.yaml b/puppet/hieradata/controller.yaml
724 index 4b7fd81..4f1fef6 100644
725 --- a/puppet/hieradata/controller.yaml
726 +++ b/puppet/hieradata/controller.yaml
727 @@ -32,6 +32,7 @@ redis::sentinel::notification_script: '/usr/local/bin/redis-notifications.sh'
729 nova::api::admin_tenant_name: 'service'
730 glance::api::keystone_tenant: 'service'
731 +aodh::api::keystone_tenant: 'service'
732 glance::registry::keystone_tenant: 'service'
733 neutron::server::auth_tenant: 'service'
734 neutron::agents::metadata::auth_tenant: 'service'
735 @@ -39,6 +40,7 @@ cinder::api::keystone_tenant: 'service'
736 swift::proxy::authtoken::admin_tenant_name: 'service'
737 ceilometer::api::keystone_tenant: 'service'
738 heat::keystone_tenant: 'service'
739 +aodh::keystone::auth::tenant: 'service'
742 keystone::cron::token_flush::maxdelay: 3600
743 @@ -115,6 +117,7 @@ tripleo::loadbalancer::mysql: true
744 tripleo::loadbalancer::redis: true
745 tripleo::loadbalancer::swift_proxy_server: true
746 tripleo::loadbalancer::ceilometer: true
747 +tripleo::loadbalancer::aodh: true
748 tripleo::loadbalancer::heat_api: true
749 tripleo::loadbalancer::heat_cloudwatch: true
750 tripleo::loadbalancer::heat_cfn: true
751 diff --git a/puppet/manifests/overcloud_compute.pp b/puppet/manifests/overcloud_compute.pp
752 index cd41cc7..b8336ee 100644
753 --- a/puppet/manifests/overcloud_compute.pp
754 +++ b/puppet/manifests/overcloud_compute.pp
755 @@ -75,9 +75,36 @@ class { '::neutron::plugins::ml2':
756 tenant_network_types => [hiera('neutron_tenant_network_type')],
759 -class { '::neutron::agents::ml2::ovs':
760 - bridge_mappings => split(hiera('neutron_bridge_mappings'), ','),
761 - tunnel_types => split(hiera('neutron_tunnel_types'), ','),
762 +if 'opendaylight' in hiera('neutron_mechanism_drivers') {
764 + if str2bool(hiera('opendaylight_install', 'false')) {
765 + $controller_ips = split(hiera('controller_node_ips'), ',')
766 + $opendaylight_controller_ip = $controller_ips[0]
768 + $opendaylight_controller_ip = hiera('opendaylight_controller_ip')
771 + if str2bool(hiera('opendaylight_install', 'false')) {
772 + class { 'neutron::plugins::ovs::opendaylight':
773 + odl_controller_ip => $opendaylight_controller_ip,
774 + tunnel_ip => hiera('neutron::agents::ml2::ovs::local_ip'),
775 + odl_port => hiera('opendaylight_port'),
776 + odl_username => hiera('opendaylight_username'),
777 + odl_password => hiera('opendaylight_password'),
781 +} elsif 'onos_ml2' in hiera('neutron_mechanism_drivers') {
782 + $controller_ips = split(hiera('controller_node_ips'), ',')
783 + class {'onos::ovs_computer':
784 + manager_ip => $controller_ips[0]
788 + class { 'neutron::agents::ml2::ovs':
789 + bridge_mappings => split(hiera('neutron_bridge_mappings'), ','),
790 + tunnel_types => split(hiera('neutron_tunnel_types'), ','),
794 if 'cisco_n1kv' in hiera('neutron_mechanism_drivers') {
795 diff --git a/puppet/manifests/overcloud_controller.pp b/puppet/manifests/overcloud_controller.pp
796 index 1f6c2be..474bb1d 100644
797 --- a/puppet/manifests/overcloud_controller.pp
798 +++ b/puppet/manifests/overcloud_controller.pp
799 @@ -30,6 +30,21 @@ if hiera('step') >= 1 {
801 if hiera('step') >= 2 {
803 + if str2bool(hiera('opendaylight_install', 'false')) {
804 + class {"opendaylight":
805 + extra_features => ['odl-ovsdb-openstack'],
806 + odl_rest_port => hiera('opendaylight_port'),
807 + enable_l3 => hiera('opendaylight_enable_l3', 'no'),
811 + if 'onos_ml2' in hiera('neutron_mechanism_drivers') {
812 + # install onos and config ovs
814 + controllers_ip => $controller_node_ips
818 if count(hiera('ntp::servers')) > 0 {
821 @@ -158,6 +173,9 @@ if hiera('step') >= 2 {
823 if hiera('step') >= 3 {
830 #TODO: need a cleanup-keystone-tokens.sh solution here
831 @@ -223,9 +241,7 @@ if hiera('step') >= 3 {
832 include ::nova::scheduler
833 include ::nova::scheduler::filter
836 include ::neutron::server
837 - include ::neutron::agents::l3
838 include ::neutron::agents::dhcp
839 include ::neutron::agents::metadata
841 @@ -237,15 +253,77 @@ if hiera('step') >= 3 {
842 require => Package['neutron'],
845 + if 'onos_ml2' in hiera('neutron_mechanism_drivers') {
846 + # config neutron service_plugins to onos driver
847 + class { '::neutron':
848 + service_plugins => [hiera('neutron_service_plugins')]
852 + if 'opendaylight' in hiera('neutron_mechanism_drivers') {
853 + if ! str2bool(hiera('opendaylight_enable_l3', 'no')) {
854 + include ::neutron::agents::l3
859 class { '::neutron::plugins::ml2':
860 flat_networks => split(hiera('neutron_flat_networks'), ','),
861 tenant_network_types => [hiera('neutron_tenant_network_type')],
862 mechanism_drivers => [hiera('neutron_mechanism_drivers')],
864 - class { '::neutron::agents::ml2::ovs':
865 - bridge_mappings => split(hiera('neutron_bridge_mappings'), ','),
866 - tunnel_types => split(hiera('neutron_tunnel_types'), ','),
868 + if 'opendaylight' in hiera('neutron_mechanism_drivers') {
869 + if ! str2bool(hiera('opendaylight_enable_l3', 'no')) {
870 + Service['neutron-server'] -> Service['neutron-l3']
873 + if str2bool(hiera('opendaylight_install', 'false')) {
874 + $controller_ips = split(hiera('controller_node_ips'), ',')
875 + $opendaylight_controller_ip = $controller_ips[0]
877 + $opendaylight_controller_ip = hiera('opendaylight_controller_ip')
880 + class { 'neutron::plugins::ml2::opendaylight':
881 + odl_controller_ip => $opendaylight_controller_ip,
882 + odl_username => hiera('opendaylight_username'),
883 + odl_password => hiera('opendaylight_password'),
884 + odl_port => hiera('opendaylight_port'),
887 + if str2bool(hiera('opendaylight_install', 'false')) {
888 + class { 'neutron::plugins::ovs::opendaylight':
889 + odl_controller_ip => $opendaylight_controller_ip,
890 + tunnel_ip => hiera('neutron::agents::ml2::ovs::local_ip'),
891 + odl_port => hiera('opendaylight_port'),
892 + odl_username => hiera('opendaylight_username'),
893 + odl_password => hiera('opendaylight_password'),
897 + } elsif 'onos_ml2' in hiera('neutron_mechanism_drivers') {
898 + #config ml2_conf.ini with onos url address
899 + $onos_port = hiera('onos_port')
900 + $private_ip = hiera('neutron::agents::ml2::ovs::local_ip')
902 + neutron_plugin_ml2 {
903 + 'onos/username': value => 'admin';
904 + 'onos/password': value => 'admin';
905 + 'onos/url_path': value => "http://${controller_node_ips[0]}:${onos_port}/onos/vtn";
910 + class { 'neutron::agents::ml2::ovs':
911 + bridge_mappings => split(hiera('neutron_bridge_mappings'), ','),
912 + tunnel_types => split(hiera('neutron_tunnel_types'), ','),
915 + Service['neutron-server'] -> Service['neutron-ovs-agent-service']
916 + Service['neutron-server'] -> Service['neutron-l3']
919 if 'cisco_n1kv' in hiera('neutron_mechanism_drivers') {
920 include ::neutron::plugins::ml2::cisco::nexus1000v
922 @@ -280,8 +358,6 @@ if hiera('step') >= 3 {
925 Service['neutron-server'] -> Service['neutron-dhcp-service']
926 - Service['neutron-server'] -> Service['neutron-l3']
927 - Service['neutron-server'] -> Service['neutron-ovs-agent-service']
928 Service['neutron-server'] -> Service['neutron-metadata']
931 @@ -447,6 +523,20 @@ if hiera('step') >= 3 {
933 Cron <| title == 'ceilometer-expirer' |> { command => "sleep $((\$(od -A n -t d -N 3 /dev/urandom) % 86400)) && ${::ceilometer::params::expirer_command}" }
936 + include ::aodh::auth
937 + include ::aodh::api
938 + include ::aodh::evaluator
939 + include ::aodh::notifier
940 + include ::aodh::listener
941 + include ::aodh::client
942 + include ::aodh::db::sync
944 + database_connection => $ceilometer_database_connection,
946 + # To manage the upgrade:
947 + Exec['ceilometer-dbsync'] -> Exec['aodh-db-sync']
952 diff --git a/puppet/manifests/overcloud_controller_pacemaker.pp b/puppet/manifests/overcloud_controller_pacemaker.pp
953 index 3fb92f3..770fc77 100644
954 --- a/puppet/manifests/overcloud_controller_pacemaker.pp
955 +++ b/puppet/manifests/overcloud_controller_pacemaker.pp
956 @@ -380,6 +380,21 @@ if hiera('step') >= 2 {
960 + if str2bool(hiera('opendaylight_install', 'false')) {
961 + class {"opendaylight":
962 + extra_features => ['odl-ovsdb-openstack'],
963 + odl_rest_port => hiera('opendaylight_port'),
964 + enable_l3 => hiera('opendaylight_enable_l3', 'no'),
968 + if 'onos_ml2' in hiera('neutron_mechanism_drivers') {
969 + # install onos and config ovs
971 + controllers_ip => $controller_node_ips
975 exec { 'galera-ready' :
976 command => '/usr/bin/clustercheck >/dev/null',
978 @@ -584,7 +599,14 @@ if hiera('step') >= 3 {
979 include ::nova::network::neutron
981 # Neutron class definitions
983 + if 'onos_ml2' in hiera('neutron_mechanism_drivers') {
984 + # config neutron service_plugins to onos driver
985 + class { '::neutron':
986 + service_plugins => [hiera('neutron_service_plugins')]
991 class { '::neutron::server' :
993 manage_service => false,
994 @@ -594,10 +616,6 @@ if hiera('step') >= 3 {
995 manage_service => false,
998 - class { '::neutron::agents::l3' :
999 - manage_service => false,
1002 class { '::neutron::agents::metadata':
1003 manage_service => false,
1005 @@ -609,18 +627,68 @@ if hiera('step') >= 3 {
1006 notify => Service['neutron-dhcp-service'],
1007 require => Package['neutron'],
1010 class { '::neutron::plugins::ml2':
1011 flat_networks => split(hiera('neutron_flat_networks'), ','),
1012 tenant_network_types => [hiera('neutron_tenant_network_type')],
1013 mechanism_drivers => [hiera('neutron_mechanism_drivers')],
1015 - class { '::neutron::agents::ml2::ovs':
1016 - manage_service => false,
1018 - bridge_mappings => split(hiera('neutron_bridge_mappings'), ','),
1019 - tunnel_types => split(hiera('neutron_tunnel_types'), ','),
1021 + if 'opendaylight' in hiera('neutron_mechanism_drivers') {
1022 + if str2bool(hiera('opendaylight_install', 'false')) {
1023 + $controller_ips = split(hiera('controller_node_ips'), ',')
1024 + $opendaylight_controller_ip = $controller_ips[0]
1026 + $opendaylight_controller_ip = hiera('opendaylight_controller_ip')
1029 + $opendaylight_port = hiera('opendaylight_port')
1030 + $private_ip = hiera('neutron::agents::ml2::ovs::local_ip')
1032 + class { 'neutron::plugins::ml2::opendaylight':
1033 + odl_controller_ip => $opendaylight_controller_ip,
1034 + odl_username => hiera('opendaylight_username'),
1035 + odl_password => hiera('opendaylight_password'),
1036 + odl_port => hiera('opendaylight_port'),
1039 + if str2bool(hiera('opendaylight_install', 'false')) {
1040 + class { 'neutron::plugins::ovs::opendaylight':
1041 + odl_controller_ip => $opendaylight_controller_ip,
1042 + tunnel_ip => hiera('neutron::agents::ml2::ovs::local_ip'),
1043 + odl_port => hiera('opendaylight_port'),
1044 + odl_username => hiera('opendaylight_username'),
1045 + odl_password => hiera('opendaylight_password'),
1048 + if ! str2bool(hiera('opendaylight_enable_l3', 'no')) {
1049 + class { '::neutron::agents::l3' :
1050 + manage_service => false,
1054 + } elsif 'onos_ml2' in hiera('neutron_mechanism_drivers') {
1055 + #config ml2_conf.ini with onos url address
1056 + $onos_port = hiera('onos_port')
1057 + $private_ip = hiera('neutron::agents::ml2::ovs::local_ip')
1059 + neutron_plugin_ml2 {
1060 + 'onos/username': value => 'admin';
1061 + 'onos/password': value => 'admin';
1062 + 'onos/url_path': value => "http://${controller_node_ips[0]}:${onos_port}/onos/vtn";
1066 + class { '::neutron::agents::l3' :
1067 + manage_service => false,
1070 + class { 'neutron::agents::ml2::ovs':
1071 + manage_service => false,
1073 + bridge_mappings => split(hiera('neutron_bridge_mappings'), ','),
1074 + tunnel_types => split(hiera('neutron_tunnel_types'), ','),
1077 if 'cisco_ucsm' in hiera('neutron_mechanism_drivers') {
1078 include ::neutron::plugins::ml2::cisco::ucsm
1080 @@ -645,8 +713,10 @@ if hiera('step') >= 3 {
1081 if hiera('neutron_enable_bigswitch_ml2', false) {
1082 include ::neutron::plugins::ml2::bigswitch::restproxy
1084 - neutron_l3_agent_config {
1085 - 'DEFAULT/ovs_use_veth': value => hiera('neutron_ovs_use_veth', false);
1086 + if !('onos_ml2' in hiera('neutron_mechanism_drivers') or str2bool(hiera('opendaylight_enable_l3', 'no'))) {
1087 + neutron_l3_agent_config {
1088 + 'DEFAULT/ovs_use_veth': value => hiera('neutron_ovs_use_veth', false);
1091 neutron_dhcp_agent_config {
1092 'DEFAULT/ovs_use_veth': value => hiera('neutron_ovs_use_veth', false);
1093 @@ -879,6 +949,28 @@ if hiera('step') >= 3 {
1099 + include ::aodh::config
1100 + include ::aodh::auth
1101 + include ::aodh::client
1102 + class { '::aodh::api':
1103 + manage_service => false,
1106 + class { '::aodh::evaluator':
1107 + manage_service => false,
1110 + class { '::aodh::notifier':
1111 + manage_service => false,
1114 + class { '::aodh::listener':
1115 + manage_service => false,
1119 # httpd/apache and horizon
1120 # NOTE(gfidente): server-status can be consumed by the pacemaker resource agent
1121 class { '::apache' :
1122 @@ -1055,62 +1147,21 @@ if hiera('step') >= 4 {
1123 clone_params => 'interleave=true',
1124 require => Pacemaker::Resource::Service[$::keystone::params::service_name],
1126 - pacemaker::resource::service { $::neutron::params::l3_agent_service:
1127 - clone_params => 'interleave=true',
1128 + if !('onos_ml2' in hiera('neutron_mechanism_drivers') or str2bool(hiera('opendaylight_enable_l3', 'no'))) {
1129 + pacemaker::resource::service { $::neutron::params::l3_agent_service:
1130 + clone_params => 'interleave=true',
1133 pacemaker::resource::service { $::neutron::params::dhcp_agent_service:
1134 clone_params => 'interleave=true',
1136 - pacemaker::resource::service { $::neutron::params::ovs_agent_service:
1137 - clone_params => 'interleave=true',
1139 pacemaker::resource::service { $::neutron::params::metadata_agent_service:
1140 clone_params => 'interleave=true',
1142 - pacemaker::resource::ocf { $::neutron::params::ovs_cleanup_service:
1143 - ocf_agent_name => 'neutron:OVSCleanup',
1144 - clone_params => 'interleave=true',
1146 pacemaker::resource::ocf { 'neutron-netns-cleanup':
1147 ocf_agent_name => 'neutron:NetnsCleanup',
1148 clone_params => 'interleave=true',
1151 - # neutron - one chain ovs-cleanup-->netns-cleanup-->ovs-agent
1152 - pacemaker::constraint::base { 'neutron-ovs-cleanup-to-netns-cleanup-constraint':
1153 - constraint_type => 'order',
1154 - first_resource => "${::neutron::params::ovs_cleanup_service}-clone",
1155 - second_resource => 'neutron-netns-cleanup-clone',
1156 - first_action => 'start',
1157 - second_action => 'start',
1158 - require => [Pacemaker::Resource::Ocf[$::neutron::params::ovs_cleanup_service],
1159 - Pacemaker::Resource::Ocf['neutron-netns-cleanup']],
1161 - pacemaker::constraint::colocation { 'neutron-ovs-cleanup-to-netns-cleanup-colocation':
1162 - source => 'neutron-netns-cleanup-clone',
1163 - target => "${::neutron::params::ovs_cleanup_service}-clone",
1164 - score => 'INFINITY',
1165 - require => [Pacemaker::Resource::Ocf[$::neutron::params::ovs_cleanup_service],
1166 - Pacemaker::Resource::Ocf['neutron-netns-cleanup']],
1168 - pacemaker::constraint::base { 'neutron-netns-cleanup-to-openvswitch-agent-constraint':
1169 - constraint_type => 'order',
1170 - first_resource => 'neutron-netns-cleanup-clone',
1171 - second_resource => "${::neutron::params::ovs_agent_service}-clone",
1172 - first_action => 'start',
1173 - second_action => 'start',
1174 - require => [Pacemaker::Resource::Ocf['neutron-netns-cleanup'],
1175 - Pacemaker::Resource::Service[$::neutron::params::ovs_agent_service]],
1177 - pacemaker::constraint::colocation { 'neutron-netns-cleanup-to-openvswitch-agent-colocation':
1178 - source => "${::neutron::params::ovs_agent_service}-clone",
1179 - target => 'neutron-netns-cleanup-clone',
1180 - score => 'INFINITY',
1181 - require => [Pacemaker::Resource::Ocf['neutron-netns-cleanup'],
1182 - Pacemaker::Resource::Service[$::neutron::params::ovs_agent_service]],
1185 - #another chain keystone-->neutron-server-->ovs-agent-->dhcp-->l3
1186 pacemaker::constraint::base { 'keystone-to-neutron-server-constraint':
1187 constraint_type => 'order',
1188 first_resource => "${::keystone::params::service_name}-clone",
1189 @@ -1120,65 +1171,110 @@ if hiera('step') >= 4 {
1190 require => [Pacemaker::Resource::Service[$::keystone::params::service_name],
1191 Pacemaker::Resource::Service[$::neutron::params::server_service]],
1193 - pacemaker::constraint::base { 'neutron-server-to-openvswitch-agent-constraint':
1194 - constraint_type => 'order',
1195 - first_resource => "${::neutron::params::server_service}-clone",
1196 - second_resource => "${::neutron::params::ovs_agent_service}-clone",
1197 - first_action => 'start',
1198 - second_action => 'start',
1199 - require => [Pacemaker::Resource::Service[$::neutron::params::server_service],
1200 - Pacemaker::Resource::Service[$::neutron::params::ovs_agent_service]],
1202 - pacemaker::constraint::base { 'neutron-openvswitch-agent-to-dhcp-agent-constraint':
1203 - constraint_type => 'order',
1204 - first_resource => "${::neutron::params::ovs_agent_service}-clone",
1205 - second_resource => "${::neutron::params::dhcp_agent_service}-clone",
1206 - first_action => 'start',
1207 - second_action => 'start',
1208 - require => [Pacemaker::Resource::Service[$::neutron::params::ovs_agent_service],
1209 - Pacemaker::Resource::Service[$::neutron::params::dhcp_agent_service]],
1210 + if 'openvswitch' in hiera('neutron_mechanism_drivers') {
1211 + pacemaker::resource::service { $::neutron::params::ovs_agent_service:
1212 + clone_params => "interleave=true",
1214 + pacemaker::resource::ocf { $::neutron::params::ovs_cleanup_service:
1215 + ocf_agent_name => "neutron:OVSCleanup",
1216 + clone_params => "interleave=true",
1218 + # neutron - one chain ovs-cleanup-->netns-cleanup-->ovs-agent
1219 + pacemaker::constraint::base { 'neutron-ovs-cleanup-to-netns-cleanup-constraint':
1220 + constraint_type => "order",
1221 + first_resource => "${::neutron::params::ovs_cleanup_service}-clone",
1222 + second_resource => "neutron-netns-cleanup-clone",
1223 + first_action => "start",
1224 + second_action => "start",
1225 + require => [Pacemaker::Resource::Ocf["${::neutron::params::ovs_cleanup_service}"],
1226 + Pacemaker::Resource::Ocf['neutron-netns-cleanup']],
1228 + pacemaker::constraint::colocation { 'neutron-ovs-cleanup-to-netns-cleanup-colocation':
1229 + source => "neutron-netns-cleanup-clone",
1230 + target => "${::neutron::params::ovs_cleanup_service}-clone",
1231 + score => "INFINITY",
1232 + require => [Pacemaker::Resource::Ocf["${::neutron::params::ovs_cleanup_service}"],
1233 + Pacemaker::Resource::Ocf['neutron-netns-cleanup']],
1235 + pacemaker::constraint::base { 'neutron-netns-cleanup-to-openvswitch-agent-constraint':
1236 + constraint_type => "order",
1237 + first_resource => "neutron-netns-cleanup-clone",
1238 + second_resource => "${::neutron::params::ovs_agent_service}-clone",
1239 + first_action => "start",
1240 + second_action => "start",
1241 + require => [Pacemaker::Resource::Ocf["neutron-netns-cleanup"],
1242 + Pacemaker::Resource::Service["${::neutron::params::ovs_agent_service}"]],
1244 + pacemaker::constraint::colocation { 'neutron-netns-cleanup-to-openvswitch-agent-colocation':
1245 + source => "${::neutron::params::ovs_agent_service}-clone",
1246 + target => "neutron-netns-cleanup-clone",
1247 + score => "INFINITY",
1248 + require => [Pacemaker::Resource::Ocf["neutron-netns-cleanup"],
1249 + Pacemaker::Resource::Service["${::neutron::params::ovs_agent_service}"]],
1252 + #another chain keystone-->neutron-server-->ovs-agent-->dhcp-->l3
1253 + pacemaker::constraint::base { 'neutron-server-to-openvswitch-agent-constraint':
1254 + constraint_type => "order",
1255 + first_resource => "${::neutron::params::server_service}-clone",
1256 + second_resource => "${::neutron::params::ovs_agent_service}-clone",
1257 + first_action => "start",
1258 + second_action => "start",
1259 + require => [Pacemaker::Resource::Service[$::neutron::params::server_service],
1260 + Pacemaker::Resource::Service[$::neutron::params::ovs_agent_service]],
1262 + pacemaker::constraint::base { 'neutron-openvswitch-agent-to-dhcp-agent-constraint':
1263 + constraint_type => "order",
1264 + first_resource => "${::neutron::params::ovs_agent_service}-clone",
1265 + second_resource => "${::neutron::params::dhcp_agent_service}-clone",
1266 + first_action => "start",
1267 + second_action => "start",
1268 + require => [Pacemaker::Resource::Service["${::neutron::params::ovs_agent_service}"],
1269 + Pacemaker::Resource::Service["${::neutron::params::dhcp_agent_service}"]],
1272 + pacemaker::constraint::colocation { 'neutron-openvswitch-agent-to-dhcp-agent-colocation':
1273 + source => "${::neutron::params::dhcp_agent_service}-clone",
1274 + target => "${::neutron::params::ovs_agent_service}-clone",
1275 + score => "INFINITY",
1276 + require => [Pacemaker::Resource::Service["${::neutron::params::ovs_agent_service}"],
1277 + Pacemaker::Resource::Service["${::neutron::params::dhcp_agent_service}"]],
1280 - pacemaker::constraint::colocation { 'neutron-openvswitch-agent-to-dhcp-agent-colocation':
1281 - source => "${::neutron::params::dhcp_agent_service}-clone",
1282 - target => "${::neutron::params::ovs_agent_service}-clone",
1283 - score => 'INFINITY',
1284 - require => [Pacemaker::Resource::Service[$::neutron::params::ovs_agent_service],
1285 - Pacemaker::Resource::Service[$::neutron::params::dhcp_agent_service]],
1287 - pacemaker::constraint::base { 'neutron-dhcp-agent-to-l3-agent-constraint':
1288 - constraint_type => 'order',
1289 - first_resource => "${::neutron::params::dhcp_agent_service}-clone",
1290 - second_resource => "${::neutron::params::l3_agent_service}-clone",
1291 - first_action => 'start',
1292 - second_action => 'start',
1293 - require => [Pacemaker::Resource::Service[$::neutron::params::dhcp_agent_service],
1294 - Pacemaker::Resource::Service[$::neutron::params::l3_agent_service]],
1296 - pacemaker::constraint::colocation { 'neutron-dhcp-agent-to-l3-agent-colocation':
1297 - source => "${::neutron::params::l3_agent_service}-clone",
1298 - target => "${::neutron::params::dhcp_agent_service}-clone",
1299 - score => 'INFINITY',
1300 - require => [Pacemaker::Resource::Service[$::neutron::params::dhcp_agent_service],
1301 - Pacemaker::Resource::Service[$::neutron::params::l3_agent_service]],
1303 - pacemaker::constraint::base { 'neutron-l3-agent-to-metadata-agent-constraint':
1304 - constraint_type => 'order',
1305 - first_resource => "${::neutron::params::l3_agent_service}-clone",
1306 - second_resource => "${::neutron::params::metadata_agent_service}-clone",
1307 - first_action => 'start',
1308 - second_action => 'start',
1309 - require => [Pacemaker::Resource::Service[$::neutron::params::l3_agent_service],
1310 - Pacemaker::Resource::Service[$::neutron::params::metadata_agent_service]],
1312 - pacemaker::constraint::colocation { 'neutron-l3-agent-to-metadata-agent-colocation':
1313 - source => "${::neutron::params::metadata_agent_service}-clone",
1314 - target => "${::neutron::params::l3_agent_service}-clone",
1315 - score => 'INFINITY',
1316 - require => [Pacemaker::Resource::Service[$::neutron::params::l3_agent_service],
1317 - Pacemaker::Resource::Service[$::neutron::params::metadata_agent_service]],
1318 + if !('onos_ml2' in hiera('neutron_mechanism_drivers') or str2bool(hiera('opendaylight_enable_l3', 'no'))) {
1319 + pacemaker::constraint::base { 'neutron-dhcp-agent-to-l3-agent-constraint':
1320 + constraint_type => 'order',
1321 + first_resource => "${::neutron::params::dhcp_agent_service}-clone",
1322 + second_resource => "${::neutron::params::l3_agent_service}-clone",
1323 + first_action => 'start',
1324 + second_action => 'start',
1325 + require => [Pacemaker::Resource::Service[$::neutron::params::dhcp_agent_service],
1326 + Pacemaker::Resource::Service[$::neutron::params::l3_agent_service]],
1328 + pacemaker::constraint::colocation { 'neutron-dhcp-agent-to-l3-agent-colocation':
1329 + source => "${::neutron::params::l3_agent_service}-clone",
1330 + target => "${::neutron::params::dhcp_agent_service}-clone",
1331 + score => 'INFINITY',
1332 + require => [Pacemaker::Resource::Service[$::neutron::params::dhcp_agent_service],
1333 + Pacemaker::Resource::Service[$::neutron::params::l3_agent_service]],
1335 + pacemaker::constraint::base { 'neutron-l3-agent-to-metadata-agent-constraint':
1336 + constraint_type => 'order',
1337 + first_resource => "${::neutron::params::l3_agent_service}-clone",
1338 + second_resource => "${::neutron::params::metadata_agent_service}-clone",
1339 + first_action => 'start',
1340 + second_action => 'start',
1341 + require => [Pacemaker::Resource::Service[$::neutron::params::l3_agent_service],
1342 + Pacemaker::Resource::Service[$::neutron::params::metadata_agent_service]],
1344 + pacemaker::constraint::colocation { 'neutron-l3-agent-to-metadata-agent-colocation':
1345 + source => "${::neutron::params::metadata_agent_service}-clone",
1346 + target => "${::neutron::params::l3_agent_service}-clone",
1347 + score => 'INFINITY',
1348 + require => [Pacemaker::Resource::Service[$::neutron::params::l3_agent_service],
1349 + Pacemaker::Resource::Service[$::neutron::params::metadata_agent_service]],
1354 pacemaker::resource::service { $::nova::params::api_service_name :
1355 clone_params => 'interleave=true',
1356 @@ -1276,7 +1372,7 @@ if hiera('step') >= 4 {
1357 Pacemaker::Resource::Service[$::nova::params::conductor_service_name]],
1361 + # Ceilometer and Aodh
1362 case downcase(hiera('ceilometer_backend')) {
1364 pacemaker::resource::service { $::ceilometer::params::agent_central_service_name :
1365 @@ -1304,6 +1400,21 @@ if hiera('step') >= 4 {
1366 pacemaker::resource::service { $::ceilometer::params::alarm_notifier_service_name :
1367 clone_params => 'interleave=true',
1369 + pacemaker::resource::service { $::aodh::params::notifier_service_name :
1370 + clone_params => 'interleave=true',
1372 + pacemaker::resource::service { $::aodh::params::expirer_package_serice :
1373 + clone_params => 'interleave=true',
1375 + pacemaker::resource::service { $::aodh::params::listener_service_name :
1376 + clone_params => 'interleave=true',
1378 + pacemaker::resource::service { $::aodh::params::api_service_name :
1379 + clone_params => 'interleave=true',
1381 + pacemaker::resource::service { $::aodh::params::evaluator_service_name :
1382 + clone_params => 'interleave=true',
1384 pacemaker::resource::service { $::ceilometer::params::agent_notification_service_name :
1385 clone_params => 'interleave=true',
1387 @@ -1315,8 +1426,10 @@ if hiera('step') >= 4 {
1388 # Fedora doesn't know `require-all` parameter for constraints yet
1389 if $::operatingsystem == 'Fedora' {
1390 $redis_ceilometer_constraint_params = undef
1391 + $redis_aodh_constraint_params = undef
1393 $redis_ceilometer_constraint_params = 'require-all=false'
1394 + $redis_aodh_constraint_params = 'require-all=false'
1396 pacemaker::constraint::base { 'redis-then-ceilometer-central-constraint':
1397 constraint_type => 'order',
1398 @@ -1328,6 +1441,16 @@ if hiera('step') >= 4 {
1399 require => [Pacemaker::Resource::Ocf['redis'],
1400 Pacemaker::Resource::Service[$::ceilometer::params::agent_central_service_name]],
1402 + pacemaker::constraint::base { 'redis-then-aodh-evaluator-constraint':
1403 + constraint_type => 'order',
1404 + first_resource => 'redis-master',
1405 + second_resource => "${::aodh::params::evaluator_service_name}-clone",
1406 + first_action => 'promote',
1407 + second_action => 'start',
1408 + constraint_params => $redis_aodh_constraint_params,
1409 + require => [Pacemaker::Resource::Ocf['redis'],
1410 + Pacemaker::Resource::Service[$::aodh::params::evaluator_service_name]],
1412 pacemaker::constraint::base { 'keystone-then-ceilometer-central-constraint':
1413 constraint_type => 'order',
1414 first_resource => "${::keystone::params::service_name}-clone",
1415 @@ -1426,6 +1549,38 @@ if hiera('step') >= 4 {
1416 require => [Pacemaker::Resource::Service[$::ceilometer::params::agent_notification_service_name],
1417 Pacemaker::Resource::Service[$::ceilometer::params::alarm_notifier_service_name]],
1419 + pacemaker::constraint::base { 'aodh-delay-then-aodh-evaluator-constraint':
1420 + constraint_type => 'order',
1421 + first_resource => 'delay-clone',
1422 + second_resource => "${::aodh::params::evaluator_service_name}-clone",
1423 + first_action => 'start',
1424 + second_action => 'start',
1425 + require => [Pacemaker::Resource::Service[$::aodh::params::evaluator_service_name],
1426 + Pacemaker::Resource::Ocf['delay']],
1428 + pacemaker::constraint::colocation { 'aodh-evaluator-with-aodh-delay-colocation':
1429 + source => "${::aodh::params::evaluator_service_name}-clone",
1430 + target => 'delay-clone',
1431 + score => 'INFINITY',
1432 + require => [Pacemaker::Resource::Service[$::horizon::params::http_service],
1433 + Pacemaker::Resource::Ocf['delay']],
1435 + pacemaker::constraint::base { 'aodh-evaluator-then-aodh-notifier-constraint':
1436 + constraint_type => 'order',
1437 + first_resource => "${::aodh::params::evaluator_service_name}-clone",
1438 + second_resource => "${::aodh::params::notifier_service_name}-clone",
1439 + first_action => 'start',
1440 + second_action => 'start',
1441 + require => [Pacemaker::Resource::Service[$::aodh::params::evaluator_service_name],
1442 + Pacemaker::Resource::Service[$::aodh::params::notifier_service_name]],
1444 + pacemaker::constraint::colocation { 'aodh-notifier-with-aodh-evaluator-colocation':
1445 + source => "${::aodh::params::notifier_service_name}-clone",
1446 + target => "${::aodh::params::evaluator_service_name}-clone",
1447 + score => 'INFINITY',
1448 + require => [Pacemaker::Resource::Service[$::aodh::params::evaluator_service_name],
1449 + Pacemaker::Resource::Service[$::aodh::params::notifier_service_name]],
1451 if downcase(hiera('ceilometer_backend')) == 'mongodb' {
1452 pacemaker::constraint::base { 'mongodb-then-ceilometer-central-constraint':
1453 constraint_type => 'order',
1454 diff --git a/puppet/manifests/overcloud_opendaylight.pp b/puppet/manifests/overcloud_opendaylight.pp
1455 new file mode 100644
1456 index 0000000..33f609a
1458 +++ b/puppet/manifests/overcloud_opendaylight.pp
1460 +# Copyright 2015 Red Hat, Inc.
1461 +# All Rights Reserved.
1463 +# Licensed under the Apache License, Version 2.0 (the "License"); you may
1464 +# not use this file except in compliance with the License. You may obtain
1465 +# a copy of the License at
1467 +# http://www.apache.org/licenses/LICENSE-2.0
1469 +# Unless required by applicable law or agreed to in writing, software
1470 +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
1471 +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
1472 +# License for the specific language governing permissions and limitations
1473 +# under the License.
1475 +include ::tripleo::packages
1477 +if count(hiera('ntp::servers')) > 0 {
1481 +class {"opendaylight":
1482 + extra_features => ['odl-ovsdb-openstack'],
1483 + odl_rest_port => hiera('opendaylight_port'),
1484 + enable_l3 => hiera('opendaylight_enable_l3', 'no'),
1487 diff --git a/puppet/opendaylight-puppet.yaml b/puppet/opendaylight-puppet.yaml
1488 new file mode 100644
1489 index 0000000..b876dc7
1491 +++ b/puppet/opendaylight-puppet.yaml
1493 +heat_template_version: 2015-04-30
1496 + OpenDaylight node configured by Puppet.
1499 + OpenDaylightFlavor:
1500 + default: baremetal
1501 + description: The flavor to use for the OpenDaylight node
1503 + OpenDaylightImage:
1504 + default: overcloud-full
1505 + description: The image to use for the OpenDaylight node
1507 + OpenDaylightHostname:
1508 + default: opendaylight-server
1509 + description: The hostname to use for the OpenDaylight node
1511 + OpenDaylightUsername:
1513 + description: The admin user for the OpenDaylight node
1515 + OpenDaylightPassword:
1517 + description: The admin password for the OpenDaylight node
1520 + OpenDaylightEnableL3:
1521 + description: Knob to enable/disable ODL L3
1526 + description: Set OpenDaylight service port
1529 + description: The keypair to use for SSH access to the node (via heat-admin user)
1533 + - custom_constraint: nova.keypair
1534 + ImageUpdatePolicy:
1535 + default: 'REBUILD_PRESERVE_EPHEMERAL'
1536 + description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
1542 + Setting to a previously unused value during stack-update will trigger
1543 + package update on all nodes
1549 + description: What interface to bridge onto br-ex for network nodes.
1554 + type: OS::Nova::Server
1556 + image: {get_param: OpenDaylightImage}
1557 + image_update_policy: {get_param: ImageUpdatePolicy}
1558 + flavor: {get_param: OpenDaylightFlavor}
1559 + key_name: {get_param: KeyName}
1561 + - network: ctlplane
1562 + user_data_format: SOFTWARE_CONFIG
1563 + user_data: {get_resource: NodeUserData}
1564 + name: {get_param: OpenDaylightHostname}
1567 + type: OS::TripleO::NodeUserData
1570 + type: OS::TripleO::Controller::Ports::ExternalPort
1572 + ControlPlaneIP: {get_attr: [OpenDaylightNode, networks, ctlplane, 0]}
1575 + type: OS::TripleO::Controller::Ports::InternalApiPort
1577 + ControlPlaneIP: {get_attr: [OpenDaylightNode, networks, ctlplane, 0]}
1580 + type: OS::TripleO::Network::Ports::NetIpMap
1582 + ControlPlaneIp: {get_attr: [OpenDaylightNode, networks, ctlplane, 0]}
1583 + ExternalIp: {get_attr: [ExternalPort, ip_address]}
1584 + InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
1587 + type: OS::TripleO::Network::Ports::NetIpSubnetMap
1589 + ControlPlaneIp: {get_attr: [OpenDaylightNode, networks, ctlplane, 0]}
1590 + ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
1591 + InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
1594 + type: OS::TripleO::Controller::Net::SoftwareConfig
1596 + ControlPlaneIp: {get_attr: [OpenDaylightNode, networks, ctlplane, 0]}
1597 + ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
1598 + InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
1600 + NetworkDeployment:
1601 + type: OS::TripleO::SoftwareDeployment
1603 + config: {get_resource: NetworkConfig}
1604 + server: {get_resource: OpenDaylightNode}
1606 + bridge_name: br-ex
1607 + interface_name: {get_param: PublicInterface}
1609 + OpenDaylightDeployment:
1610 + type: OS::TripleO::SoftwareDeployment
1611 + depends_on: NetworkDeployment
1613 + config: {get_resource: OpenDaylightConfig}
1614 + server: {get_resource: OpenDaylightNode}
1618 + template: '["server"]'
1620 + server: {get_param: NtpServer}
1621 + opendaylight_port: {get_param: OpenDaylightPort}
1622 + opendaylight_enable_l3: {get_param: OpenDaylightEnableL3}
1623 + opendaylight_username: {get_param: OpenDaylightUsername}
1624 + opendaylight_password: {get_param: OpenDaylightPassword}
1626 + OpenDaylightConfig:
1627 + type: OS::Heat::StructuredConfig
1629 + group: os-apply-config
1634 + - heat_config_%{::deploy_config_name}
1636 + - bootstrap_node # provided by BootstrapNodeConfig
1637 + - all_nodes # provided by allNodesConfig
1638 + - vip_data # provided by vip-config
1639 + - RedHat # Workaround for https://bugzilla.redhat.com/show_bug.cgi?id=1236143
1643 + raw_data: {get_file: hieradata/common.yaml}
1645 + ntp::servers: {get_input: ntp_servers}
1646 + opendaylight::admin_username: {get_param: OpenDaylightUsername}
1647 + opendaylight::admin_password: {get_param: OpenDaylightPassword}
1648 + opendaylight_port: {get_input: opendaylight_port}
1649 + opendaylight_enable_l3: {get_input: opendaylight_enable_l3}
1651 + raw_data: {get_file: hieradata/ceph.yaml}
1654 + type: OS::TripleO::Tasks::PackageUpdate
1657 + type: OS::Heat::SoftwareDeployment
1659 + config: {get_resource: UpdateConfig}
1660 + server: {get_resource: OpenDaylightNode}
1662 + update_identifier:
1663 + get_param: UpdateIdentifier
1665 + OpenDaylightHostsConfig:
1666 + type: OS::Heat::SoftwareConfig
1670 + #!/usr/bin/env bash
1671 + echo -e "$(facter ipaddress)\t\t$(hostname -f)\t$(hostname -s)" >> /etc/hosts
1673 + OpenDaylightHostsDeployment:
1674 + type: OS::Heat::StructuredDeployment
1675 + depends_on: OpenDaylightDeployment
1677 + server: {get_resource: OpenDaylightNode}
1678 + config: {get_resource: OpenDaylightHostsConfig}
1680 + OpenDaylightPuppetConfig:
1681 + type: OS::Heat::SoftwareConfig
1685 + get_file: manifests/overcloud_opendaylight.pp
1687 + OpenDaylightPuppetDeployment:
1688 + depends_on: OpenDaylightHostsDeployment
1689 + type: OS::Heat::StructuredDeployment
1691 + server: {get_resource: OpenDaylightNode}
1692 + config: {get_resource: OpenDaylightPuppetConfig}
1694 + update_identifier: {get_param: UpdateIdentifier}
1698 + description: IP address of the server in the ctlplane network
1699 + value: {get_attr: [OpenDaylightNode, networks, ctlplane, 0]}
1700 + opendaylight_controller_ip:
1701 + description: IP address of the server on the internal network
1702 + value: {get_attr: [InternalApiPort, ip_address]}
1703 + config_identifier:
1704 + description: identifier which changes if the node configuration may need re-applying
1708 + - - {get_attr: [OpenDaylightDeployment, deploy_stdout]}
1709 + - {get_param: UpdateIdentifier}
1711 2.5.4 (Apple Git-61)