X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=build%2Fopnfv-tripleo-heat-templates.patch;h=f75c430bd0aabe576eaf8f08eaa32a2e2b37235a;hb=57944a996c0e546c3726d70d55ad16912fe9fbb8;hp=be40742eb87ac9ae1780c18d883d5c1e615ea9a3;hpb=8a46a78ddd2460358416c3cfec1de86002b0e018;p=apex.git diff --git a/build/opnfv-tripleo-heat-templates.patch b/build/opnfv-tripleo-heat-templates.patch index be40742e..f75c430b 100644 --- a/build/opnfv-tripleo-heat-templates.patch +++ b/build/opnfv-tripleo-heat-templates.patch @@ -1,31 +1,35 @@ -From 63f8b6412f526ba245d86f40eb6b1ae1ee06485d Mon Sep 17 00:00:00 2001 -From: Dan Radez -Date: Sun, 13 Dec 2015 21:20:40 -0500 -Subject: [PATCH] Adds OpenDaylight support +From d86b6e5cc493645e01484a1ea6cfff29cce2fa3d Mon Sep 17 00:00:00 2001 +From: Tim Rozet +Date: Tue, 12 Jan 2016 16:49:57 -0500 +Subject: [PATCH] Adds current opnfv patch with ODL and ONOS support -To enable OpenDaylight on controllers use environments/opendaylight.yaml -To enable OpenDaylight on external node use -environments/opendaylight-external.yaml - -Adds onos support --- environments/onos.yaml | 8 + environments/opendaylight-external.yaml | 25 ++ environments/opendaylight.yaml | 25 ++ + environments/opendaylight_l3.yaml | 9 + + environments/opendaylight_sdnvpn.yaml | 29 ++ + environments/opendaylight_sfc.yaml | 28 ++ + network/endpoints/endpoint_map.yaml | 31 ++ overcloud-resource-registry-puppet.yaml | 3 + - overcloud-without-mergepy.yaml | 62 +++++ - puppet/all-nodes-config.yaml | 6 + - puppet/compute.yaml | 25 ++ - puppet/controller.yaml | 35 +++ - puppet/manifests/overcloud_compute.pp | 33 ++- - puppet/manifests/overcloud_controller.pp | 80 +++++- - puppet/manifests/overcloud_controller_pacemaker.pp | 299 +++++++++++++-------- - puppet/manifests/overcloud_opendaylight.pp | 26 ++ - puppet/opendaylight-puppet.yaml | 209 ++++++++++++++ - 13 files changed, 712 insertions(+), 124 deletions(-) + overcloud-without-mergepy.yaml | 93 +++++ + puppet/all-nodes-config.yaml | 17 + + puppet/compute.yaml | 35 ++ + puppet/controller.yaml | 93 ++++- + puppet/hieradata/common.yaml | 1 + + puppet/hieradata/controller.yaml | 5 +- + puppet/manifests/overcloud_compute.pp | 31 +- + puppet/manifests/overcloud_controller.pp | 128 +++++- + puppet/manifests/overcloud_controller_pacemaker.pp | 456 ++++++++++++++------- + puppet/manifests/overcloud_opendaylight.pp | 27 ++ + puppet/opendaylight-puppet.yaml | 223 ++++++++++ + 19 files changed, 1105 insertions(+), 162 deletions(-) create mode 100644 environments/onos.yaml create mode 100644 environments/opendaylight-external.yaml create mode 100644 environments/opendaylight.yaml + create mode 100644 environments/opendaylight_l3.yaml + create mode 100644 environments/opendaylight_sdnvpn.yaml + create mode 100644 environments/opendaylight_sfc.yaml create mode 100644 puppet/manifests/overcloud_opendaylight.pp create mode 100644 puppet/opendaylight-puppet.yaml @@ -105,8 +109,155 @@ index 0000000..c8abf75 + # reduce OpenDaylightCount to 0 if you don't want any + # OpenDaylight only nodes + opendaylight_install: true +diff --git a/environments/opendaylight_l3.yaml b/environments/opendaylight_l3.yaml +new file mode 100644 +index 0000000..05c0aff +--- /dev/null ++++ b/environments/opendaylight_l3.yaml +@@ -0,0 +1,9 @@ ++parameters: ++ #NeutronEnableL3Agent: false ++ NeutronEnableForceMetadata: true ++ OpenDaylightEnableL3: "'yes'" ++ NeutronServicePlugins: "networking_odl.l3.l3_odl.OpenDaylightL3RouterPlugin" ++ ExtraConfig: ++ neutron_mechanism_drivers: ['opendaylight'] ++ neutron_tenant_network_type: vxlan ++ opendaylight_install: true +diff --git a/environments/opendaylight_sdnvpn.yaml b/environments/opendaylight_sdnvpn.yaml +new file mode 100644 +index 0000000..3a14975 +--- /dev/null ++++ b/environments/opendaylight_sdnvpn.yaml +@@ -0,0 +1,29 @@ ++# Environment file used to enable OpenDaylight ++# Currently uses overcloud image that is assumed ++# to be virt-customized with ODL RPM already on it ++ ++# These parameters customize the OpenDaylight Node ++# The user name and password are for the ODL service ++# Defaults are included here for reference ++#parameter_defaults: ++# OpenDaylightFlavor: baremetal ++# OpenDaylightHostname: opendaylight-server ++# OpenDaylightImage: overcloud-full ++# OpenDaylightUsername: admin ++# OpenDaylightPassword: admin ++ ++parameters: ++ # increase this if you need more ODL nodes ++ # OpenDaylightCount: 1 ++ ControllerEnableSwiftStorage: false ++ OpenDaylightFeatures: "odl-ovsdb-openstack,odl-vpnservice-api,odl-vpnservice-impl,odl-vpnservice-impl-rest,odl-vpnservice-impl-ui,odl-vpnservice-core" ++ NeutronL3HA: false ++ NeutronServicePlugins: "router,qos,networking_bgpvpn.neutron.services.plugin.BGPVPNPlugin" ++ ExtraConfig: ++ tripleo::ringbuilder::build_ring: False ++ neutron_mechanism_drivers: ['opendaylight'] ++ neutron_tenant_network_type: vxlan ++ # Enable this if you want OpenDaylight on the contollers ++ # reduce OpenDaylightCount to 0 if you don't want any ++ # OpenDaylight only nodes ++ opendaylight_install: true +diff --git a/environments/opendaylight_sfc.yaml b/environments/opendaylight_sfc.yaml +new file mode 100644 +index 0000000..3dd1e13 +--- /dev/null ++++ b/environments/opendaylight_sfc.yaml +@@ -0,0 +1,28 @@ ++# Environment file used to enable OpenDaylight ++# Currently uses overcloud image that is assumed ++# to be virt-customized with ODL RPM already on it ++ ++# These parameters customize the OpenDaylight Node ++# The user name and password are for the ODL service ++# Defaults are included here for reference ++#parameter_defaults: ++# OpenDaylightFlavor: baremetal ++# OpenDaylightHostname: opendaylight-server ++# OpenDaylightImage: overcloud-full ++# OpenDaylightUsername: admin ++# OpenDaylightPassword: admin ++ ++parameters: ++ # increase this if you need more ODL nodes ++ # OpenDaylightCount: 1 ++ ControllerEnableSwiftStorage: false ++ OpenDaylightFeatures: "odl-ovsdb-sfc-rest" ++ NeutronL3HA: false ++ ExtraConfig: ++ tripleo::ringbuilder::build_ring: False ++ neutron_mechanism_drivers: ['opendaylight'] ++ neutron_tenant_network_type: vxlan ++ # Enable this if you want OpenDaylight on the contollers ++ # reduce OpenDaylightCount to 0 if you don't want any ++ # OpenDaylight only nodes ++ opendaylight_install: true +diff --git a/network/endpoints/endpoint_map.yaml b/network/endpoints/endpoint_map.yaml +index 0521401..7caa91b 100644 +--- a/network/endpoints/endpoint_map.yaml ++++ b/network/endpoints/endpoint_map.yaml +@@ -4,6 +4,9 @@ description: > + A Map of OpenStack Endpoints + + parameters: ++ AodhApiVirtualIP: ++ type: string ++ default: '' + CeilometerApiVirtualIP: + type: string + default: '' +@@ -43,6 +46,9 @@ parameters: + EndpointMap: + type: json + default: ++ AodhAdmin: {protocol: 'http', port: '8042', host: 'IP_ADDRESS'} ++ AodhInternal: {protocol: 'http', port: '8042', host: 'IP_ADDRESS'} ++ AodhPublic: {protocol: 'http', port: '8042', host: 'IP_ADDRESS'} + CeilometerAdmin: {protocol: 'http', port: '8777', host: 'IP_ADDRESS'} + CeilometerInternal: {protocol: 'http', port: '8777', host: 'IP_ADDRESS'} + CeilometerPublic: {protocol: 'http', port: '8777', host: 'IP_ADDRESS'} +@@ -83,6 +89,28 @@ parameters: + + resources: + ++ AodhInternal: ++ type: OS::TripleO::Endpoint ++ properties: ++ EndpointName: AodhInternal ++ EndpointMap: { get_param: EndpointMap } ++ CloudName: {get_param: CloudName} ++ IP: {get_param: AodhApiVirtualIP} ++ AodhPublic: ++ type: OS::TripleO::Endpoint ++ properties: ++ EndpointName: AodhPublic ++ EndpointMap: { get_param: EndpointMap } ++ CloudName: {get_param: CloudName} ++ IP: {get_param: PublicVirtualIP} ++ AodhAdmin: ++ type: OS::TripleO::Endpoint ++ properties: ++ EndpointName: AodhAdmin ++ EndpointMap: { get_param: EndpointMap } ++ CloudName: {get_param: CloudName} ++ IP: {get_param: AodhApiVirtualIP} ++ + CeilometerInternal: + type: OS::TripleO::Endpoint + properties: +@@ -407,6 +435,9 @@ resources: + outputs: + endpoint_map: + value: ++ AodhInternal: {get_attr: [ AodhInternal, endpoint] } ++ AodhPublic: {get_attr: [ AodhPublic, endpoint] } ++ AodhAdmin: {get_attr: [ AodhAdmin, endpoint] } + CeilometerInternal: {get_attr: [ CeilometerInternal, endpoint] } + CeilometerPublic: {get_attr: [ CeilometerPublic, endpoint] } + CeilometerAdmin: {get_attr: [ CeilometerAdmin, endpoint] } diff --git a/overcloud-resource-registry-puppet.yaml b/overcloud-resource-registry-puppet.yaml -index c072c29..2413450 100644 +index 4cfed6b..adecc79 100644 --- a/overcloud-resource-registry-puppet.yaml +++ b/overcloud-resource-registry-puppet.yaml @@ -27,6 +27,9 @@ resource_registry: @@ -120,10 +271,33 @@ index c072c29..2413450 100644 # NodeUserData == Cloud-init additional user-data, e.g cloud-config # ControllerExtraConfigPre == Controller configuration pre service deployment diff --git a/overcloud-without-mergepy.yaml b/overcloud-without-mergepy.yaml -index 01c0079..210ec11 100644 +index a532c2f..965ca4c 100644 --- a/overcloud-without-mergepy.yaml +++ b/overcloud-without-mergepy.yaml -@@ -227,6 +227,23 @@ parameters: +@@ -15,6 +15,11 @@ parameters: + description: The password for the keystone admin account, used for monitoring, querying neutron etc. + type: string + hidden: true ++ AodhPassword: ++ default: unset ++ description: The password for the aodh services ++ type: string ++ hidden: true + CeilometerBackend: + default: 'mongodb' + description: The ceilometer backend type. +@@ -113,6 +118,10 @@ parameters: + default: '' + type: string + description: Neutron ID for ctlplane network. ++ NeutronEnableForceMetadata: ++ default: 'False' ++ description: If True, DHCP always provides metadata route to VM. ++ type: string + NeutronEnableTunnelling: + type: string + default: "True" +@@ -227,6 +236,31 @@ parameters: default: false description: Should MongoDb journaling be disabled type: boolean @@ -131,6 +305,14 @@ index 01c0079..210ec11 100644 + default: 8081 + description: Set opendaylight service port + type: number ++ OpenDaylightEnableL3: ++ description: Knob to enable/disable ODL L3 ++ type: string ++ default: 'no' ++ OpenDaylightFeatures: ++ description: List of features to install with ODL ++ type: comma_delimited_list ++ default: "odl-ovsdb-openstack" + OpenDaylightInstall: + default: false + description: Whether to install OpenDaylight on the control nodes. @@ -147,7 +329,15 @@ index 01c0079..210ec11 100644 PublicVirtualFixedIPs: default: [] description: > -@@ -650,6 +667,18 @@ parameters: +@@ -575,6 +609,7 @@ parameters: + default: + NeutronTenantNetwork: tenant + CeilometerApiNetwork: internal_api ++ AodhApiNetwork: internal_api + MongoDbNetwork: internal_api + CinderApiNetwork: internal_api + CinderIscsiNetwork: storage +@@ -664,6 +699,18 @@ parameters: structure as ExtraConfig. type: json @@ -166,7 +356,7 @@ index 01c0079..210ec11 100644 # Hostname format for each role # Note %index% is translated into the index of the node, e.g 0/1/2 etc # and %stackname% is replaced with OS::stack_name in the template below. -@@ -674,6 +703,10 @@ parameters: +@@ -688,6 +735,10 @@ parameters: type: string description: Format for CephStorage node hostnames default: '%stackname%-cephstorage-%index%' @@ -177,7 +367,15 @@ index 01c0079..210ec11 100644 # Identifiers to trigger tasks on nodes UpdateIdentifier: -@@ -756,6 +789,27 @@ resources: +@@ -758,6 +809,7 @@ resources: + properties: + CloudName: {get_param: CloudName} + CeilometerApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]} ++ AodhApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]} + CinderApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]} + GlanceApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]} + GlanceRegistryVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]} +@@ -770,6 +822,29 @@ resources: SwiftProxyVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]} PublicVirtualIP: {get_attr: [VipMap, net_ip_map, external]} @@ -195,7 +393,9 @@ index 01c0079..210ec11 100644 + OpenDaylightImage: {get_param: OpenDaylightImage} + OpenDaylightPort: {get_param: OpenDaylightPort} + OpenDaylightUsername: {get_param: OpenDaylightUsername} ++ OpenDaylightFeatures: {get_param: OpenDaylightFeatures} + OpenDaylightPassword: {get_param: OpenDaylightPassword} ++ OpenDaylightEnableL3: {get_param: OpenDaylightEnableL3} + OpenDaylightHostname: + str_replace: + template: {get_param: OpenDaylightHostnameFormat} @@ -205,19 +405,45 @@ index 01c0079..210ec11 100644 Controller: type: OS::Heat::ResourceGroup depends_on: Networks -@@ -839,6 +893,10 @@ resources: +@@ -781,6 +856,7 @@ resources: + properties: + AdminPassword: {get_param: AdminPassword} + AdminToken: {get_param: AdminToken} ++ AodhPassword: {get_param: AodhPassword} + CeilometerBackend: {get_param: CeilometerBackend} + CeilometerMeteringSecret: {get_param: CeilometerMeteringSecret} + CeilometerPassword: {get_param: CeilometerPassword} +@@ -832,6 +908,7 @@ resources: + NeutronBridgeMappings: {get_param: NeutronBridgeMappings} + NeutronExternalNetworkBridge: {get_param: NeutronExternalNetworkBridge} + NeutronEnableTunnelling: {get_param: NeutronEnableTunnelling} ++ NeutronEnableForceMetadata: {get_param: NeutronEnableForceMetadata} + NeutronNetworkVLANRanges: {get_param: NeutronNetworkVLANRanges} + NeutronPublicInterface: {get_param: NeutronPublicInterface} + NeutronPublicInterfaceDefaultRoute: {get_param: NeutronPublicInterfaceDefaultRoute} +@@ -853,6 +930,12 @@ resources: NovaPassword: {get_param: NovaPassword} NtpServer: {get_param: NtpServer} MongoDbNoJournal: {get_param: MongoDbNoJournal} + OpenDaylightPort: {get_param: OpenDaylightPort} + OpenDaylightInstall: {get_param: OpenDaylightInstall} + OpenDaylightUsername: {get_param: OpenDaylightUsername} ++ OpenDaylightFeatures: {get_param: OpenDaylightFeatures} + OpenDaylightPassword: {get_param: OpenDaylightPassword} ++ OpenDaylightEnableL3: {get_param: OpenDaylightEnableL3} PcsdPassword: {get_resource: PcsdPassword} PublicVirtualInterface: {get_param: PublicVirtualInterface} RabbitPassword: {get_param: RabbitPassword} -@@ -933,6 +991,9 @@ resources: - NovaPublicIP: {get_attr: [VipMap, net_ip_map, external]} +@@ -878,6 +961,7 @@ resources: + ServiceNetMap: {get_param: ServiceNetMap} + EndpointMap: {get_attr: [EndpointMap, endpoint_map]} + CeilometerApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]} ++ AodhApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]} + CinderApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]} + HeatApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]} + GlanceApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]} +@@ -948,6 +1032,9 @@ resources: + NovaPublicIP: {get_attr: [PublicVirtualIP, ip_address]} NovaPassword: {get_param: NovaPassword} NtpServer: {get_param: NtpServer} + OpenDaylightPort: {get_param: OpenDaylightPort} @@ -226,7 +452,7 @@ index 01c0079..210ec11 100644 RabbitHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]} RabbitPassword: {get_param: RabbitPassword} RabbitUserName: {get_param: RabbitUserName} -@@ -1053,6 +1114,7 @@ resources: +@@ -1068,6 +1155,7 @@ resources: compute_hosts: {get_attr: [Compute, hosts_entry]} controller_hosts: {get_attr: [Controller, hosts_entry]} controller_ips: {get_attr: [Controller, ip_address]} @@ -234,8 +460,34 @@ index 01c0079..210ec11 100644 block_storage_hosts: {get_attr: [BlockStorage, hosts_entry]} object_storage_hosts: {get_attr: [ObjectStorage, hosts_entry]} ceph_storage_hosts: {get_attr: [CephStorage, hosts_entry]} +@@ -1081,6 +1169,7 @@ resources: + heat_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]} + swift_proxy_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]} + ceilometer_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]} ++ aodh_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]} + nova_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]} + nova_metadata_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]} + glance_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]} +@@ -1189,6 +1278,7 @@ resources: + nova_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]} + nova_metadata_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]} + ceilometer_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]} ++ aodh_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]} + heat_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]} + horizon_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]} + redis_vip: {get_attr: [RedisVirtualIP, ip_address]} +@@ -1434,6 +1524,9 @@ outputs: + PublicVip: + description: Controller VIP for public API endpoints + value: {get_attr: [PublicVirtualIP, ip_address]} ++ AodhInternalVip: ++ description: VIP for Aodh API internal endpoint ++ value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]} + CeilometerInternalVip: + description: VIP for Ceilometer API internal endpoint + value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]} diff --git a/puppet/all-nodes-config.yaml b/puppet/all-nodes-config.yaml -index 2bc519b..98283c2 100644 +index 2bc519b..d649ba0 100644 --- a/puppet/all-nodes-config.yaml +++ b/puppet/all-nodes-config.yaml @@ -8,6 +8,8 @@ parameters: @@ -247,7 +499,16 @@ index 2bc519b..98283c2 100644 block_storage_hosts: type: comma_delimited_list object_storage_hosts: -@@ -82,6 +84,10 @@ resources: +@@ -34,6 +36,8 @@ parameters: + type: comma_delimited_list + ceilometer_api_node_ips: + type: comma_delimited_list ++ aodh_api_node_ips: ++ type: comma_delimited_list + nova_api_node_ips: + type: comma_delimited_list + nova_metadata_node_ips: +@@ -82,6 +86,10 @@ resources: raw_data: {get_file: hieradata/RedHat.yaml} all_nodes: mapped_data: @@ -258,8 +519,31 @@ index 2bc519b..98283c2 100644 controller_node_ips: list_join: - ',' +@@ -166,6 +174,14 @@ resources: + list_join: + - "','" + - {get_param: ceilometer_api_node_ips} ++ aodh_api_node_ips: ++ str_replace: ++ template: "['SERVERS_LIST']" ++ params: ++ SERVERS_LIST: ++ list_join: ++ - "','" ++ - {get_param: aodh_api_node_ips} + nova_api_node_ips: + str_replace: + template: "['SERVERS_LIST']" +@@ -239,6 +255,7 @@ resources: + neutron::rabbit_hosts: *rabbit_nodes_array + nova::rabbit_hosts: *rabbit_nodes_array + keystone::rabbit_hosts: *rabbit_nodes_array ++ aodh::rabbit_hosts: *rabbit_nodes_array + + outputs: + config_id: diff --git a/puppet/compute.yaml b/puppet/compute.yaml -index e259cff..5527669 100644 +index 70c7403..13fd4f6 100644 --- a/puppet/compute.yaml +++ b/puppet/compute.yaml @@ -213,6 +213,23 @@ parameters: @@ -286,8 +570,36 @@ index e259cff..5527669 100644 RabbitHost: type: string default: '' # Has to be here because of the ignored empty value bug -@@ -415,6 +432,10 @@ resources: - neutron::rabbit_user: {get_input: rabbit_username} +@@ -320,6 +337,11 @@ resources: + properties: + ControlPlaneIP: {get_attr: [NovaCompute, networks, ctlplane, 0]} + ++ ExternalPort: ++ type: OS::TripleO::Controller::Ports::ExternalPort ++ properties: ++ ControlPlaneIP: {get_attr: [NovaCompute, networks, ctlplane, 0]} ++ + NetIpMap: + type: OS::TripleO::Network::Ports::NetIpMap + properties: +@@ -327,6 +349,7 @@ resources: + InternalApiIp: {get_attr: [InternalApiPort, ip_address]} + StorageIp: {get_attr: [StoragePort, ip_address]} + TenantIp: {get_attr: [TenantPort, ip_address]} ++ ExternalIp: {get_attr: [ExternalPort, ip_address]} + + NetworkConfig: + type: OS::TripleO::Compute::Net::SoftwareConfig +@@ -335,6 +358,7 @@ resources: + InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]} + StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]} + TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]} ++ ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]} + + NetworkDeployment: + type: OS::TripleO::SoftwareDeployment +@@ -406,6 +430,10 @@ resources: + neutron::rabbit_user: {get_input: rabbit_user} neutron::rabbit_use_ssl: {get_input: rabbit_client_use_ssl} neutron::rabbit_port: {get_input: rabbit_client_port} + opendaylight_port: {get_input: opendaylight_port} @@ -297,7 +609,7 @@ index e259cff..5527669 100644 neutron_flat_networks: {get_input: neutron_flat_networks} neutron_host: {get_input: neutron_host} neutron::agents::ml2::ovs::local_ip: {get_input: neutron_local_ip} -@@ -468,6 +489,10 @@ resources: +@@ -459,6 +487,10 @@ resources: snmpd_readonly_user_name: {get_param: SnmpdReadonlyUserName} snmpd_readonly_user_password: {get_param: SnmpdReadonlyUserPassword} glance_api_servers: {get_param: [EndpointMap, GlanceInternal, uri]} @@ -308,11 +620,47 @@ index e259cff..5527669 100644 neutron_flat_networks: {get_param: NeutronFlatNetworks} neutron_host: {get_param: NeutronHost} neutron_local_ip: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NeutronTenantNetwork]}]} +@@ -570,6 +602,9 @@ outputs: + tenant_ip_address: + description: IP address of the server in the tenant network + value: {get_attr: [TenantPort, ip_address]} ++ external_ip_address: ++ description: IP address of the server in the external network ++ value: {get_attr: [ExternalPort, ip_address]} + hostname: + description: Hostname of the server + value: {get_attr: [NovaCompute, name]} diff --git a/puppet/controller.yaml b/puppet/controller.yaml -index fdc1821..865a838 100644 +index ea0b3af..bd82e93 100644 --- a/puppet/controller.yaml +++ b/puppet/controller.yaml -@@ -443,6 +443,27 @@ parameters: +@@ -14,6 +14,14 @@ parameters: + description: The keystone auth secret and db password. + type: string + hidden: true ++ AodhApiVirtualIP: ++ type: string ++ default: '' ++ AodhPassword: ++ default: unset ++ description: The password for the aodh services. ++ type: string ++ hidden: true + CeilometerApiVirtualIP: + type: string + default: '' +@@ -357,6 +365,10 @@ parameters: + default: 'True' + description: Allow automatic l3-agent failover + type: string ++ NeutronEnableForceMetadata: ++ default: 'False' ++ description: If True, DHCP always provides metadata route to VM. ++ type: string + NeutronEnableTunnelling: + type: string + default: "True" +@@ -443,6 +455,35 @@ parameters: NtpServer: type: string default: '' @@ -333,6 +681,14 @@ index fdc1821..865a838 100644 + type: string + description: The password for the opendaylight server. + hidden: true ++ OpenDaylightEnableL3: ++ description: Knob to enable/disable ODL L3 ++ type: string ++ default: 'no' ++ OpenDaylightFeatures: ++ description: List of features to install with ODL ++ type: comma_delimited_list ++ default: "odl-ovsdb-openstack" + ONOSPort: + default: 8181 + description: Set onos service port @@ -340,7 +696,23 @@ index fdc1821..865a838 100644 PcsdPassword: type: string description: The password for the 'pcsd' user. -@@ -819,6 +840,11 @@ resources: +@@ -696,6 +737,7 @@ resources: + input_values: + bootstack_nodeid: {get_attr: [Controller, name]} + neutron_enable_tunneling: {get_param: NeutronEnableTunnelling} ++ neutron_enable_force_metadata: {get_param: NeutronEnableForceMetadata} + haproxy_log_address: {get_param: HAProxySyslogAddress} + heat.watch_server_url: + list_join: +@@ -774,6 +816,7 @@ resources: + - {get_param: MysqlVirtualIP} + - '/heat' + keystone_ca_certificate: {get_param: KeystoneCACertificate} ++ keystone_admin_vip: {get_param: KeystoneAdminApiVirtualIP} + keystone_signing_key: {get_param: KeystoneSigningKey} + keystone_signing_certificate: {get_param: KeystoneSigningCertificate} + keystone_ssl_certificate: {get_param: KeystoneSSLCertificate} +@@ -805,6 +848,13 @@ resources: template: tripleo-CLUSTER params: CLUSTER: {get_param: MysqlClusterUniquePart} @@ -348,11 +720,51 @@ index fdc1821..865a838 100644 + opendaylight_install: {get_param: OpenDaylightInstall} + opendaylight_username: {get_param: OpenDaylightUsername} + opendaylight_password: {get_param: OpenDaylightPassword} ++ opendaylight_enable_l3: {get_param: OpenDaylightEnableL3} ++ opendaylight_features: {get_param: OpenDaylightFeatures} + onos_port: {get_param: ONOSPort} neutron_flat_networks: {get_param: NeutronFlatNetworks} neutron_metadata_proxy_shared_secret: {get_param: NeutronMetadataProxySharedSecret} neutron_agent_mode: {get_param: NeutronAgentMode} -@@ -1151,6 +1177,15 @@ resources: +@@ -879,6 +929,7 @@ resources: + ceilometer_backend: {get_param: CeilometerBackend} + ceilometer_metering_secret: {get_param: CeilometerMeteringSecret} + ceilometer_password: {get_param: CeilometerPassword} ++ aodh_password: {get_param: AodhPassword} + ceilometer_coordination_url: + list_join: + - '' +@@ -891,6 +942,12 @@ resources: + - - 'mysql://ceilometer:unset@' + - {get_param: MysqlVirtualIP} + - '/ceilometer' ++ ceilometer_public_url: {get_param: [EndpointMap, CeilometerPublic, uri]} ++ ceilometer_internal_url: {get_param: [EndpointMap, CeilometerInternal, uri]} ++ ceilometer_admin_url: {get_param: [EndpointMap, CeilometerAdmin, uri]} ++ aodh_public_url: {get_param: [EndpointMap, AodhPublic, uri]} ++ aodh_internal_url: {get_param: [EndpointMap, AodhInternal, uri]} ++ aodh_admin_url: {get_param: [EndpointMap, AodhAdmin, uri]} + snmpd_readonly_user_name: {get_param: SnmpdReadonlyUserName} + snmpd_readonly_user_password: {get_param: SnmpdReadonlyUserPassword} + nova_password: {get_param: NovaPassword} +@@ -948,6 +1005,7 @@ resources: + neutron_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]} + neutron_local_ip: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NeutronTenantNetwork]}]} + ceilometer_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]} ++ aodh_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]} + nova_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]} + nova_metadata_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]} + horizon_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]} +@@ -1041,7 +1099,7 @@ resources: + cinder_iscsi_ip_address: {get_input: cinder_iscsi_network} + cinder::database_connection: {get_input: cinder_dsn} + cinder::api::keystone_password: {get_input: cinder_password} +- cinder::api::auth_uri: {get_input: keystone_auth_uri} ++ cinder::api::keystone_auth_host: {get_input: keystone_admin_vip} + cinder::api::identity_uri: {get_input: keystone_identity_uri} + cinder::api::bind_host: {get_input: cinder_api_network} + cinder::rabbit_userid: {get_input: rabbit_username} +@@ -1136,6 +1194,17 @@ resources: mysql_bind_host: {get_input: mysql_network} mysql_virtual_ip: {get_input: mysql_virtual_ip} @@ -361,18 +773,105 @@ index fdc1821..865a838 100644 + opendaylight_install: {get_input: opendaylight_install} + opendaylight_username: {get_input: opendaylight_username} + opendaylight_password: {get_input: opendaylight_password} -+ ++ opendaylight_enable_l3: {get_input: opendaylight_enable_l3} ++ opendaylight_features: {get_input: opendaylight_features} ++ + # ONOS + onos_port: {get_input: onos_port} + # Neutron neutron::bind_host: {get_input: neutron_api_network} neutron::rabbit_password: {get_input: rabbit_password} +@@ -1152,6 +1221,7 @@ resources: + neutron_flat_networks: {get_input: neutron_flat_networks} + neutron::agents::metadata::shared_secret: {get_input: neutron_metadata_proxy_shared_secret} + neutron::agents::metadata::metadata_ip: {get_input: neutron_api_network} ++ neutron::agents::dhcp::enable_force_metadata: {get_input: neutron_enable_force_metadata} + neutron_agent_mode: {get_input: neutron_agent_mode} + neutron_router_distributed: {get_input: neutron_router_distributed} + neutron::core_plugin: {get_input: neutron_core_plugin} +@@ -1198,6 +1268,27 @@ resources: + snmpd_readonly_user_name: {get_input: snmpd_readonly_user_name} + snmpd_readonly_user_password: {get_input: snmpd_readonly_user_password} + ++ # Aodh ++ aodh::rabbit_userid: {get_input: rabbit_username} ++ aodh::rabbit_password: {get_input: rabbit_password} ++ aodh::rabbit_use_ssl: {get_input: rabbit_client_use_ssl} ++ aodh::rabbit_port: {get_input: rabbit_client_port} ++ aodh::debug: {get_input: debug} ++ aodh::wsgi::apache::ssl: false ++ aodh::api::service_name: 'httpd' ++ aodh::api::host: {get_input: aodh_api_network} ++ aodh::api::keystone_password: {get_input: aodh_password} ++ aodh::api::keystone_auth_uri: {get_input: keystone_auth_uri} ++ aodh::api::keystone_identity_uri: {get_input: keystone_identity_uri} ++ aodh::auth::auth_password: {get_input: aodh_password} ++ aodh::keystone::auth::public_url: {get_input: aodh_public_url } ++ aodh::keystone::auth::internal_url: {get_input: aodh_internal_url } ++ aodh::keystone::auth::admin_url: {get_input: aodh_admin_url } ++ aodh::keystone::auth::password: {get_input: aodh_password } ++ aodh::keystone::auth::region: {get_input: keystone_region} ++ # for a migration path from ceilometer-alarm to aodh, we use the same database & coordination ++ aodh::evaluator::coordination_url: {get_input: ceilometer_coordination_url} ++ + # Nova + nova::rabbit_userid: {get_input: rabbit_username} + nova::rabbit_password: {get_input: rabbit_password} +diff --git a/puppet/hieradata/common.yaml b/puppet/hieradata/common.yaml +index 030f661..5840016 100644 +--- a/puppet/hieradata/common.yaml ++++ b/puppet/hieradata/common.yaml +@@ -6,6 +6,7 @@ ceilometer::agent::auth::auth_region: 'regionOne' + # FIXME: Might be better to use 'service' tenant here but this requires + # changes in the tripleo-incubator keystone role setup + ceilometer::agent::auth::auth_tenant_name: 'admin' ++aodh::auth::auth_tenant_name: 'admin' + + nova::network::neutron::neutron_admin_tenant_name: 'service' + nova::network::neutron::neutron_admin_username: 'neutron' +diff --git a/puppet/hieradata/controller.yaml b/puppet/hieradata/controller.yaml +index 4b7fd81..7dbc2e9 100644 +--- a/puppet/hieradata/controller.yaml ++++ b/puppet/hieradata/controller.yaml +@@ -32,6 +32,7 @@ redis::sentinel::notification_script: '/usr/local/bin/redis-notifications.sh' + # service tenant + nova::api::admin_tenant_name: 'service' + glance::api::keystone_tenant: 'service' ++aodh::api::keystone_tenant: 'service' + glance::registry::keystone_tenant: 'service' + neutron::server::auth_tenant: 'service' + neutron::agents::metadata::auth_tenant: 'service' +@@ -39,6 +40,7 @@ cinder::api::keystone_tenant: 'service' + swift::proxy::authtoken::admin_tenant_name: 'service' + ceilometer::api::keystone_tenant: 'service' + heat::keystone_tenant: 'service' ++aodh::keystone::auth::tenant: 'service' + + # keystone + keystone::cron::token_flush::maxdelay: 3600 +@@ -72,7 +74,7 @@ neutron::agents::dhcp::dnsmasq_config_file: /etc/neutron/dnsmasq-neutron.conf + + # nova + nova::notify_on_state_change: 'vm_and_task_state' +-nova::api::default_floating_pool: 'public' ++nova::api::default_floating_pool: 'external' + nova::api::osapi_v3: true + nova::scheduler::filter::ram_allocation_ratio: '1.0' + +@@ -115,6 +117,7 @@ tripleo::loadbalancer::mysql: true + tripleo::loadbalancer::redis: true + tripleo::loadbalancer::swift_proxy_server: true + tripleo::loadbalancer::ceilometer: true ++tripleo::loadbalancer::aodh: true + tripleo::loadbalancer::heat_api: true + tripleo::loadbalancer::heat_cloudwatch: true + tripleo::loadbalancer::heat_cfn: true diff --git a/puppet/manifests/overcloud_compute.pp b/puppet/manifests/overcloud_compute.pp -index cd41cc7..b8336ee 100644 +index cd41cc7..110ca1d 100644 --- a/puppet/manifests/overcloud_compute.pp +++ b/puppet/manifests/overcloud_compute.pp -@@ -75,9 +75,36 @@ class { '::neutron::plugins::ml2': +@@ -75,9 +75,34 @@ class { '::neutron::plugins::ml2': tenant_network_types => [hiera('neutron_tenant_network_type')], } @@ -388,14 +887,12 @@ index cd41cc7..b8336ee 100644 + $opendaylight_controller_ip = hiera('opendaylight_controller_ip') + } + -+ if str2bool(hiera('opendaylight_install', 'false')) { -+ class { 'neutron::plugins::ovs::opendaylight': ++ class { 'neutron::plugins::ovs::opendaylight': + odl_controller_ip => $opendaylight_controller_ip, + tunnel_ip => hiera('neutron::agents::ml2::ovs::local_ip'), + odl_port => hiera('opendaylight_port'), + odl_username => hiera('opendaylight_username'), + odl_password => hiera('opendaylight_password'), -+ } + } + +} elsif 'onos_ml2' in hiera('neutron_mechanism_drivers') { @@ -413,17 +910,18 @@ index cd41cc7..b8336ee 100644 if 'cisco_n1kv' in hiera('neutron_mechanism_drivers') { diff --git a/puppet/manifests/overcloud_controller.pp b/puppet/manifests/overcloud_controller.pp -index 1b0429b..d3f3d2d 100644 +index 1f6c2be..1095758 100644 --- a/puppet/manifests/overcloud_controller.pp +++ b/puppet/manifests/overcloud_controller.pp -@@ -30,6 +30,20 @@ if hiera('step') >= 1 { +@@ -30,6 +30,21 @@ if hiera('step') >= 1 { if hiera('step') >= 2 { + if str2bool(hiera('opendaylight_install', 'false')) { + class {"opendaylight": -+ extra_features => ['odl-ovsdb-openstack'], ++ extra_features => any2array(hiera('opendaylight_features', 'odl-ovsdb-openstack')), + odl_rest_port => hiera('opendaylight_port'), ++ enable_l3 => hiera('opendaylight_enable_l3', 'no'), + } + } + @@ -437,7 +935,17 @@ index 1b0429b..d3f3d2d 100644 if count(hiera('ntp::servers')) > 0 { include ::ntp } -@@ -223,9 +237,7 @@ +@@ -158,6 +173,9 @@ if hiera('step') >= 2 { + + if hiera('step') >= 3 { + ++ # Apache ++ include ::apache ++ + include ::keystone + + #TODO: need a cleanup-keystone-tokens.sh solution here +@@ -223,9 +241,7 @@ if hiera('step') >= 3 { include ::nova::scheduler include ::nova::scheduler::filter @@ -447,7 +955,7 @@ index 1b0429b..d3f3d2d 100644 include ::neutron::agents::dhcp include ::neutron::agents::metadata -@@ -238,15 +250,71 @@ if hiera('step') >= 3 { +@@ -237,15 +253,101 @@ if hiera('step') >= 3 { require => Package['neutron'], } @@ -458,7 +966,11 @@ index 1b0429b..d3f3d2d 100644 + } + } else { + include ::neutron -+ include ::neutron::agents::l3 ++ if 'opendaylight' in hiera('neutron_mechanism_drivers') { ++ if ! str2bool(hiera('opendaylight_enable_l3', 'no')) { ++ include ::neutron::agents::l3 ++ } ++ } + } + class { '::neutron::plugins::ml2': @@ -471,6 +983,9 @@ index 1b0429b..d3f3d2d 100644 - tunnel_types => split(hiera('neutron_tunnel_types'), ','), + + if 'opendaylight' in hiera('neutron_mechanism_drivers') { ++ if ! str2bool(hiera('opendaylight_enable_l3', 'no')) { ++ Service['neutron-server'] -> Service['neutron-l3'] ++ } + + if str2bool(hiera('opendaylight_install', 'false')) { + $controller_ips = split(hiera('controller_node_ips'), ',') @@ -479,6 +994,30 @@ index 1b0429b..d3f3d2d 100644 + $opendaylight_controller_ip = hiera('opendaylight_controller_ip') + } + ++ # co-existence hacks for SFC ++ if hiera('opendaylight_features', 'odl-ovsdb-openstack') =~ /odl-ovsdb-sfc-rest/ { ++ $opendaylight_port = hiera('opendaylight_port') ++ $netvirt_coexist_url = "http://${opendaylight_controller_ip}:${opendaylight_port}/restconf/config/netvirt-providers-config:netvirt-providers-config" ++ $netvirt_post_body = "{'netvirt-providers-config': {'table-offset': 1}}" ++ $sfc_coexist_url = "http://${opendaylight_controller_ip}:${opendaylight_port}/restconf/config/sfc-of-renderer:sfc-of-renderer-config" ++ $sfc_post_body = "{ 'sfc-of-renderer-config' : { 'sfc-of-table-offset' : 150, 'sfc-of-app-egress-table-offset' : 11 }}" ++ $odl_username = hiera('opendaylight_username') ++ $odl_password = hiera('opendaylight_password') ++ exec { 'Coexistence table offsets for netvirt': ++ command => "curl -o /dev/null --fail --silent -u ${odl_username}:${odl_password} ${netvirt_coexist_url} -i -H 'Content-Type: application/json' --data \'${netvirt_post_body}\' -X PUT", ++ tries => 5, ++ try_sleep => 30, ++ path => '/usr/sbin:/usr/bin:/sbin:/bin', ++ } -> ++ # Coexist for SFC ++ exec { 'Coexistence table offsets for sfc': ++ command => "curl -o /dev/null --fail --silent -u ${odl_username}:${odl_password} ${sfc_coexist_url} -i -H 'Content-Type: application/json' --data \'${sfc_post_body}\' -X PUT", ++ tries => 5, ++ try_sleep => 30, ++ path => '/usr/sbin:/usr/bin:/sbin:/bin', ++ } ++ } ++ + class { 'neutron::plugins::ml2::opendaylight': + odl_controller_ip => $opendaylight_controller_ip, + odl_username => hiera('opendaylight_username'), @@ -495,7 +1034,6 @@ index 1b0429b..d3f3d2d 100644 + odl_password => hiera('opendaylight_password'), + } + } -+ Service['neutron-server'] -> Service['neutron-l3'] + + } elsif 'onos_ml2' in hiera('neutron_mechanism_drivers') { + #config ml2_conf.ini with onos url address @@ -522,7 +1060,7 @@ index 1b0429b..d3f3d2d 100644 if 'cisco_n1kv' in hiera('neutron_mechanism_drivers') { include ::neutron::plugins::ml2::cisco::nexus1000v -@@ -281,8 +349,6 @@ if hiera('step') >= 3 { +@@ -280,8 +382,6 @@ if hiera('step') >= 3 { } Service['neutron-server'] -> Service['neutron-dhcp-service'] @@ -531,18 +1069,40 @@ index 1b0429b..d3f3d2d 100644 Service['neutron-server'] -> Service['neutron-metadata'] include ::cinder +@@ -447,6 +547,20 @@ if hiera('step') >= 3 { + + Cron <| title == 'ceilometer-expirer' |> { command => "sleep $((\$(od -A n -t d -N 3 /dev/urandom) % 86400)) && ${::ceilometer::params::expirer_command}" } + ++ # Aodh ++ include ::aodh::auth ++ include ::aodh::api ++ include ::aodh::evaluator ++ include ::aodh::notifier ++ include ::aodh::listener ++ include ::aodh::client ++ include ::aodh::db::sync ++ class { '::aodh' : ++ database_connection => $ceilometer_database_connection, ++ } ++ # To manage the upgrade: ++ Exec['ceilometer-dbsync'] -> Exec['aodh-db-sync'] ++ + # Heat + include ::heat + include ::heat::api diff --git a/puppet/manifests/overcloud_controller_pacemaker.pp b/puppet/manifests/overcloud_controller_pacemaker.pp -index 863cc5f..5b1c37a 100644 +index 3fb92f3..cb00e9a 100644 --- a/puppet/manifests/overcloud_controller_pacemaker.pp +++ b/puppet/manifests/overcloud_controller_pacemaker.pp -@@ -380,6 +380,20 @@ if hiera('step') >= 2 { +@@ -380,6 +380,21 @@ if hiera('step') >= 2 { } + if str2bool(hiera('opendaylight_install', 'false')) { + class {"opendaylight": -+ extra_features => ['odl-ovsdb-openstack'], ++ extra_features => any2array(hiera('opendaylight_features', 'odl-ovsdb-openstack')), + odl_rest_port => hiera('opendaylight_port'), ++ enable_l3 => hiera('opendaylight_enable_l3', 'no'), + } + } + @@ -556,7 +1116,7 @@ index 863cc5f..5b1c37a 100644 exec { 'galera-ready' : command => '/usr/bin/clustercheck >/dev/null', timeout => 30, -@@ -584,7 +598,14 @@ if hiera('step') >= 3 { +@@ -584,7 +599,14 @@ if hiera('step') >= 3 { include ::nova::network::neutron # Neutron class definitions @@ -572,7 +1132,7 @@ index 863cc5f..5b1c37a 100644 class { '::neutron::server' : sync_db => $sync_db, manage_service => false, -@@ -595,10 +616,6 @@ if hiera('step') >= 3 { +@@ -594,10 +616,6 @@ if hiera('step') >= 3 { manage_service => false, enabled => false, } @@ -583,10 +1143,22 @@ index 863cc5f..5b1c37a 100644 class { '::neutron::agents::metadata': manage_service => false, enabled => false, -@@ -610,18 +627,66 @@ if hiera('step') >= 3 { +@@ -609,18 +627,80 @@ if hiera('step') >= 3 { notify => Service['neutron-dhcp-service'], require => Package['neutron'], } ++ ++ # SDNVPN Hack ++ if ('networking_bgpvpn.neutron.services.plugin.BGPVPNPlugin' in hiera('neutron::service_plugins')) ++ { ++ class { 'neutron::config': ++ server_config => { ++ 'service_providers/service_provider' => { ++ 'value' => 'BGPVPN:Dummy:networking_bgpvpn.neutron.services.service_drivers.driver_api.BGPVPNDriver:default' ++ } ++ } ++ } ++ } + class { '::neutron::plugins::ml2': flat_networks => split(hiera('neutron_flat_networks'), ','), @@ -626,21 +1198,23 @@ index 863cc5f..5b1c37a 100644 + odl_password => hiera('opendaylight_password'), + } + } -+ class { '::neutron::agents::l3' : -+ manage_service => false, -+ enabled => false, ++ if ! str2bool(hiera('opendaylight_enable_l3', 'no')) { ++ class { '::neutron::agents::l3' : ++ manage_service => false, ++ enabled => false, ++ } + } + } elsif 'onos_ml2' in hiera('neutron_mechanism_drivers') { + #config ml2_conf.ini with onos url address + $onos_port = hiera('onos_port') + $private_ip = hiera('neutron::agents::ml2::ovs::local_ip') -+ + + neutron_plugin_ml2 { + 'onos/username': value => 'admin'; + 'onos/password': value => 'admin'; + 'onos/url_path': value => "http://${controller_node_ips[0]}:${onos_port}/onos/vtn"; + } - ++ + } else { + class { '::neutron::agents::l3' : + manage_service => false, @@ -656,22 +1230,100 @@ index 863cc5f..5b1c37a 100644 if 'cisco_ucsm' in hiera('neutron_mechanism_drivers') { include ::neutron::plugins::ml2::cisco::ucsm } -@@ -646,8 +711,10 @@ if hiera('step') >= 3 { +@@ -645,8 +725,10 @@ if hiera('step') >= 3 { if hiera('neutron_enable_bigswitch_ml2', false) { include ::neutron::plugins::ml2::bigswitch::restproxy } - neutron_l3_agent_config { - 'DEFAULT/ovs_use_veth': value => hiera('neutron_ovs_use_veth', false); -+ if !('onos_ml2' in hiera('neutron_mechanism_drivers')) { ++ if !('onos_ml2' in hiera('neutron_mechanism_drivers') or str2bool(hiera('opendaylight_enable_l3', 'no'))) { + neutron_l3_agent_config { + 'DEFAULT/ovs_use_veth': value => hiera('neutron_ovs_use_veth', false); + } } neutron_dhcp_agent_config { 'DEFAULT/ovs_use_veth': value => hiera('neutron_ovs_use_veth', false); -@@ -1073,62 +1140,21 @@ if hiera('step') >= 4 { - require => Pacemaker::Resource::Service[$::keystone::params::service_name] - } +@@ -813,13 +895,13 @@ if hiera('step') >= 3 { + swift::storage::filter::healthcheck { $swift_components : } + } + ++ $mongo_node_string = join($mongo_node_ips_with_port, ',') + # Ceilometer + case downcase(hiera('ceilometer_backend')) { + /mysql/: { + $ceilometer_database_connection = hiera('ceilometer_mysql_conn_string') + } + default: { +- $mongo_node_string = join($mongo_node_ips_with_port, ',') + $ceilometer_database_connection = "mongodb://${mongo_node_string}/ceilometer?replicaSet=${mongodb_replset}" + } + } +@@ -879,6 +961,62 @@ if hiera('step') >= 3 { + enabled => false, + } + ++ $aodh_database_connection = "mongodb://${mongo_node_string}/aodh?replicaSet=${mongodb_replset}" ++ ++ class { '::aodh::db': ++ database_connection => $aodh_database_connection ++ } ++ ++ # Aodh ++ include ::aodh ++ include ::aodh::config ++ include ::aodh::auth ++ include ::aodh::client ++ class { '::aodh::api': ++ manage_service => false, ++ enabled => false, ++ } ++ class { '::aodh::evaluator': ++ manage_service => false, ++ enabled => false, ++ } ++ class { '::aodh::notifier': ++ manage_service => false, ++ enabled => false, ++ } ++ class { '::aodh::listener': ++ manage_service => false, ++ enabled => false, ++ } ++ ++ $event_pipeline = "--- ++sources: ++ - name: event_source ++ events: ++ - \"*\" ++ sinks: ++ - event_sink ++sinks: ++ - name: event_sink ++ transformers: ++ triggers: ++ publishers: ++ - notifier://?topic=alarm.all ++ - notifier:// ++" ++ ++ # aodh hacks ++ file { '/etc/ceilometer/event_pipeline.yaml': ++ ensure => present, ++ content => $event_pipeline ++ } ++ ++ user { 'aodh': ++ groups => 'nobody' ++ } ++ ++ ++ + # httpd/apache and horizon + # NOTE(gfidente): server-status can be consumed by the pacemaker resource agent + class { '::apache' : +@@ -1055,62 +1193,21 @@ if hiera('step') >= 4 { + clone_params => 'interleave=true', + require => Pacemaker::Resource::Service[$::keystone::params::service_name], } - pacemaker::resource::service { $::neutron::params::l3_agent_service: - clone_params => 'interleave=true', @@ -736,7 +1388,7 @@ index 863cc5f..5b1c37a 100644 pacemaker::constraint::base { 'keystone-to-neutron-server-constraint': constraint_type => 'order', first_resource => "${::keystone::params::service_name}-clone", -@@ -1138,65 +1164,110 @@ if hiera('step') >= 4 { +@@ -1120,65 +1217,110 @@ if hiera('step') >= 4 { require => [Pacemaker::Resource::Service[$::keystone::params::service_name], Pacemaker::Resource::Service[$::neutron::params::server_service]], } @@ -865,7 +1517,7 @@ index 863cc5f..5b1c37a 100644 - score => 'INFINITY', - require => [Pacemaker::Resource::Service[$::neutron::params::l3_agent_service], - Pacemaker::Resource::Service[$::neutron::params::metadata_agent_service]], -+ if !('onos_ml2' in hiera('neutron_mechanism_drivers')) { ++ if !('onos_ml2' in hiera('neutron_mechanism_drivers') or str2bool(hiera('opendaylight_enable_l3', 'no'))) { + pacemaker::constraint::base { 'neutron-dhcp-agent-to-l3-agent-constraint': + constraint_type => 'order', + first_resource => "${::neutron::params::dhcp_agent_service}-clone", @@ -897,18 +1549,156 @@ index 863cc5f..5b1c37a 100644 + score => 'INFINITY', + require => [Pacemaker::Resource::Service[$::neutron::params::l3_agent_service], + Pacemaker::Resource::Service[$::neutron::params::metadata_agent_service]], -+ } ++ } } - # Nova pacemaker::resource::service { $::nova::params::api_service_name : clone_params => 'interleave=true', +@@ -1276,7 +1418,7 @@ if hiera('step') >= 4 { + Pacemaker::Resource::Service[$::nova::params::conductor_service_name]], + } + +- # Ceilometer ++ # Ceilometer and Aodh + case downcase(hiera('ceilometer_backend')) { + /mysql/: { + pacemaker::resource::service { $::ceilometer::params::agent_central_service_name : +@@ -1298,10 +1440,19 @@ if hiera('step') >= 4 { + pacemaker::resource::service { $::ceilometer::params::api_service_name : + clone_params => 'interleave=true', + } +- pacemaker::resource::service { $::ceilometer::params::alarm_evaluator_service_name : ++ pacemaker::resource::service { $::aodh::params::notifier_service_name : + clone_params => 'interleave=true', + } +- pacemaker::resource::service { $::ceilometer::params::alarm_notifier_service_name : ++ pacemaker::resource::service { $::aodh::params::expirer_package_serice : ++ clone_params => 'interleave=true', ++ } ++ pacemaker::resource::service { $::aodh::params::listener_service_name : ++ clone_params => 'interleave=true', ++ } ++ pacemaker::resource::service { $::aodh::params::api_service_name : ++ clone_params => 'interleave=true', ++ } ++ pacemaker::resource::service { $::aodh::params::evaluator_service_name : + clone_params => 'interleave=true', + } + pacemaker::resource::service { $::ceilometer::params::agent_notification_service_name : +@@ -1315,8 +1466,19 @@ if hiera('step') >= 4 { + # Fedora doesn't know `require-all` parameter for constraints yet + if $::operatingsystem == 'Fedora' { + $redis_ceilometer_constraint_params = undef ++ $redis_aodh_constraint_params = undef + } else { + $redis_ceilometer_constraint_params = 'require-all=false' ++ $redis_aodh_constraint_params = 'require-all=false' ++ } ++ pacemaker::constraint::base { 'keystone-then-aodh-api-constraint': ++ constraint_type => 'order', ++ first_resource => "${::keystone::params::service_name}-clone", ++ second_resource => "${::aodh::params::api_service_name}-clone", ++ first_action => 'start', ++ second_action => 'start', ++ require => [Pacemaker::Resource::Service[$::aodh::params::api_service_name], ++ Pacemaker::Resource::Service[$::keystone::params::service_name]], + } + pacemaker::constraint::base { 'redis-then-ceilometer-central-constraint': + constraint_type => 'order', +@@ -1328,6 +1490,16 @@ if hiera('step') >= 4 { + require => [Pacemaker::Resource::Ocf['redis'], + Pacemaker::Resource::Service[$::ceilometer::params::agent_central_service_name]], + } ++ pacemaker::constraint::base { 'redis-then-aodh-evaluator-constraint': ++ constraint_type => 'order', ++ first_resource => 'redis-master', ++ second_resource => "${::aodh::params::evaluator_service_name}-clone", ++ first_action => 'promote', ++ second_action => 'start', ++ constraint_params => $redis_aodh_constraint_params, ++ require => [Pacemaker::Resource::Ocf['redis'], ++ Pacemaker::Resource::Service[$::aodh::params::evaluator_service_name]], ++ } + pacemaker::constraint::base { 'keystone-then-ceilometer-central-constraint': + constraint_type => 'order', + first_resource => "${::keystone::params::service_name}-clone", +@@ -1378,53 +1550,37 @@ if hiera('step') >= 4 { + require => [Pacemaker::Resource::Service[$::ceilometer::params::api_service_name], + Pacemaker::Resource::Ocf['delay']], + } +- pacemaker::constraint::base { 'ceilometer-delay-then-ceilometer-alarm-evaluator-constraint': ++ pacemaker::constraint::base { 'aodh-delay-then-aodh-evaluator-constraint': + constraint_type => 'order', + first_resource => 'delay-clone', +- second_resource => "${::ceilometer::params::alarm_evaluator_service_name}-clone", ++ second_resource => "${::aodh::params::evaluator_service_name}-clone", + first_action => 'start', + second_action => 'start', +- require => [Pacemaker::Resource::Service[$::ceilometer::params::alarm_evaluator_service_name], ++ require => [Pacemaker::Resource::Service[$::aodh::params::evaluator_service_name], + Pacemaker::Resource::Ocf['delay']], + } +- pacemaker::constraint::colocation { 'ceilometer-alarm-evaluator-with-ceilometer-delay-colocation': +- source => "${::ceilometer::params::alarm_evaluator_service_name}-clone", ++ pacemaker::constraint::colocation { 'aodh-evaluator-with-aodh-delay-colocation': ++ source => "${::aodh::params::evaluator_service_name}-clone", + target => 'delay-clone', + score => 'INFINITY', +- require => [Pacemaker::Resource::Service[$::ceilometer::params::api_service_name], ++ require => [Pacemaker::Resource::Service[$::horizon::params::http_service], + Pacemaker::Resource::Ocf['delay']], + } +- pacemaker::constraint::base { 'ceilometer-alarm-evaluator-then-ceilometer-alarm-notifier-constraint': +- constraint_type => 'order', +- first_resource => "${::ceilometer::params::alarm_evaluator_service_name}-clone", +- second_resource => "${::ceilometer::params::alarm_notifier_service_name}-clone", +- first_action => 'start', +- second_action => 'start', +- require => [Pacemaker::Resource::Service[$::ceilometer::params::alarm_evaluator_service_name], +- Pacemaker::Resource::Service[$::ceilometer::params::alarm_notifier_service_name]], +- } +- pacemaker::constraint::colocation { 'ceilometer-alarm-notifier-with-ceilometer-alarm-evaluator-colocation': +- source => "${::ceilometer::params::alarm_notifier_service_name}-clone", +- target => "${::ceilometer::params::alarm_evaluator_service_name}-clone", +- score => 'INFINITY', +- require => [Pacemaker::Resource::Service[$::ceilometer::params::alarm_evaluator_service_name], +- Pacemaker::Resource::Service[$::ceilometer::params::alarm_notifier_service_name]], +- } +- pacemaker::constraint::base { 'ceilometer-alarm-notifier-then-ceilometer-notification-constraint': ++ pacemaker::constraint::base { 'aodh-evaluator-then-aodh-notifier-constraint': + constraint_type => 'order', +- first_resource => "${::ceilometer::params::alarm_notifier_service_name}-clone", +- second_resource => "${::ceilometer::params::agent_notification_service_name}-clone", ++ first_resource => "${::aodh::params::evaluator_service_name}-clone", ++ second_resource => "${::aodh::params::notifier_service_name}-clone", + first_action => 'start', + second_action => 'start', +- require => [Pacemaker::Resource::Service[$::ceilometer::params::agent_notification_service_name], +- Pacemaker::Resource::Service[$::ceilometer::params::alarm_notifier_service_name]], ++ require => [Pacemaker::Resource::Service[$::aodh::params::evaluator_service_name], ++ Pacemaker::Resource::Service[$::aodh::params::notifier_service_name]], + } +- pacemaker::constraint::colocation { 'ceilometer-notification-with-ceilometer-alarm-notifier-colocation': +- source => "${::ceilometer::params::agent_notification_service_name}-clone", +- target => "${::ceilometer::params::alarm_notifier_service_name}-clone", ++ pacemaker::constraint::colocation { 'aodh-notifier-with-aodh-evaluator-colocation': ++ source => "${::aodh::params::notifier_service_name}-clone", ++ target => "${::aodh::params::evaluator_service_name}-clone", + score => 'INFINITY', +- require => [Pacemaker::Resource::Service[$::ceilometer::params::agent_notification_service_name], +- Pacemaker::Resource::Service[$::ceilometer::params::alarm_notifier_service_name]], ++ require => [Pacemaker::Resource::Service[$::aodh::params::evaluator_service_name], ++ Pacemaker::Resource::Service[$::aodh::params::notifier_service_name]], + } + if downcase(hiera('ceilometer_backend')) == 'mongodb' { + pacemaker::constraint::base { 'mongodb-then-ceilometer-central-constraint': diff --git a/puppet/manifests/overcloud_opendaylight.pp b/puppet/manifests/overcloud_opendaylight.pp new file mode 100644 -index 0000000..aea6568 +index 0000000..aeb31be --- /dev/null +++ b/puppet/manifests/overcloud_opendaylight.pp -@@ -0,0 +1,26 @@ +@@ -0,0 +1,27 @@ +# Copyright 2015 Red Hat, Inc. +# All Rights Reserved. +# @@ -931,16 +1721,17 @@ index 0000000..aea6568 +} + +class {"opendaylight": -+ extra_features => ['odl-ovsdb-openstack'], ++ extra_features => any2array(hiera('opendaylight_features', 'odl-ovsdb-openstack')), + odl_rest_port => hiera('opendaylight_port'), ++ enable_l3 => hiera('opendaylight_enable_l3', 'no'), +} + diff --git a/puppet/opendaylight-puppet.yaml b/puppet/opendaylight-puppet.yaml new file mode 100644 -index 0000000..70f2543 +index 0000000..6488e0e --- /dev/null +++ b/puppet/opendaylight-puppet.yaml -@@ -0,0 +1,209 @@ +@@ -0,0 +1,223 @@ +heat_template_version: 2015-04-30 + +description: > @@ -968,6 +1759,14 @@ index 0000000..70f2543 + description: The admin password for the OpenDaylight node + type: string + hidden: true ++ OpenDaylightEnableL3: ++ description: Knob to enable/disable ODL L3 ++ type: string ++ default: 'no' ++ OpenDaylightFeatures: ++ description: List of features to install with ODL ++ type: comma_delimited_list ++ default: "odl-ovsdb-openstack" + OpenDaylightPort: + default: 8081 + description: Set OpenDaylight service port @@ -1066,6 +1865,10 @@ index 0000000..70f2543 + params: + server: {get_param: NtpServer} + opendaylight_port: {get_param: OpenDaylightPort} ++ opendaylight_enable_l3: {get_param: OpenDaylightEnableL3} ++ opendaylight_username: {get_param: OpenDaylightUsername} ++ opendaylight_password: {get_param: OpenDaylightPassword} ++ opendaylight_features: {get_param: OpenDaylightFeatures} + + OpenDaylightConfig: + type: OS::Heat::StructuredConfig @@ -1090,6 +1893,8 @@ index 0000000..70f2543 + opendaylight::admin_username: {get_param: OpenDaylightUsername} + opendaylight::admin_password: {get_param: OpenDaylightPassword} + opendaylight_port: {get_input: opendaylight_port} ++ opendaylight_enable_l3: {get_input: opendaylight_enable_l3} ++ opendaylight_features: {get_input: opendaylight_features} + ceph: + raw_data: {get_file: hieradata/ceph.yaml} + @@ -1151,5 +1956,5 @@ index 0000000..70f2543 + - - {get_attr: [OpenDaylightDeployment, deploy_stdout]} + - {get_param: UpdateIdentifier} -- -2.5.0 +1.8.3.1