summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/facter/alt_fqdns.rb17
-rw-r--r--lib/puppet/parser/functions/tripleo_swift_devices.rb39
-rw-r--r--lib/puppet/provider/sriov_vf_config/numvfs.rb57
-rw-r--r--lib/puppet/type/sriov_vf_config.rb10
-rw-r--r--manifests/haproxy.pp159
-rw-r--r--manifests/haproxy/endpoint.pp6
-rw-r--r--manifests/host/sriov.pp27
-rw-r--r--manifests/host/sriov/numvfs_persistence.pp55
-rw-r--r--manifests/keepalived.pp18
-rw-r--r--manifests/pacemaker/resource_restart_flag.pp35
-rw-r--r--manifests/profile/base/aodh.pp12
-rw-r--r--manifests/profile/base/aodh/api.pp26
-rw-r--r--manifests/profile/base/aodh/evaluator.pp15
-rw-r--r--manifests/profile/base/aodh/listener.pp15
-rw-r--r--manifests/profile/base/aodh/notifier.pp15
-rw-r--r--manifests/profile/base/ceilometer.pp9
-rw-r--r--manifests/profile/base/ceilometer/api.pp2
-rw-r--r--manifests/profile/base/ceilometer/collector.pp8
-rw-r--r--manifests/profile/base/ceilometer/expirer.pp3
-rw-r--r--manifests/profile/base/ceph.pp34
-rw-r--r--manifests/profile/base/ceph/rgw.pp63
-rw-r--r--manifests/profile/base/cinder.pp9
-rw-r--r--manifests/profile/base/cinder/backup.pp (renamed from manifests/profile/base/monitoring/fluentd.pp)23
-rw-r--r--manifests/profile/base/cinder/backup/ceph.pp36
-rw-r--r--manifests/profile/base/cinder/backup/swift.pp36
-rw-r--r--manifests/profile/base/cinder/volume.pp8
-rw-r--r--manifests/profile/base/cinder/volume/iscsi.pp5
-rw-r--r--manifests/profile/base/database/mongodbcommon.pp2
-rw-r--r--manifests/profile/base/glance/api.pp9
-rw-r--r--manifests/profile/base/gnocchi/metricd.pp4
-rw-r--r--manifests/profile/base/gnocchi/statsd.pp4
-rw-r--r--manifests/profile/base/haproxy.pp14
-rw-r--r--manifests/profile/base/heat.pp7
-rw-r--r--manifests/profile/base/heat/api.pp3
-rw-r--r--manifests/profile/base/heat/api_cfn.pp3
-rw-r--r--manifests/profile/base/heat/api_cloudwatch.pp3
-rw-r--r--manifests/profile/base/heat/engine.pp3
-rw-r--r--manifests/profile/base/horizon.pp4
-rw-r--r--manifests/profile/base/ironic.pp10
-rw-r--r--manifests/profile/base/ironic/conductor.pp18
-rw-r--r--manifests/profile/base/kernel.pp10
-rw-r--r--manifests/profile/base/keystone.pp58
-rw-r--r--manifests/profile/base/logging/fluentd.pp180
-rw-r--r--manifests/profile/base/manila/api.pp11
-rw-r--r--manifests/profile/base/mistral.pp1
-rw-r--r--manifests/profile/base/neutron.pp11
-rw-r--r--manifests/profile/base/neutron/agents/ovn.pp38
-rw-r--r--manifests/profile/base/neutron/midonet.pp4
-rw-r--r--manifests/profile/base/neutron/opencontrail/vrouter.pp40
-rw-r--r--manifests/profile/base/neutron/opendaylight.pp46
-rw-r--r--manifests/profile/base/neutron/plugins/ml2.pp8
-rw-r--r--manifests/profile/base/neutron/plugins/ml2/opendaylight.pp54
-rw-r--r--manifests/profile/base/neutron/plugins/ml2/ovn.pp46
-rw-r--r--manifests/profile/base/neutron/plugins/ovs/opendaylight.pp73
-rw-r--r--manifests/profile/base/neutron/plumgrid.pp45
-rw-r--r--manifests/profile/base/neutron/sriov.pp43
-rw-r--r--manifests/profile/base/nova.pp13
-rw-r--r--manifests/profile/base/pacemaker.pp4
-rw-r--r--manifests/profile/base/rabbitmq.pp4
-rw-r--r--manifests/profile/base/sahara.pp8
-rw-r--r--manifests/profile/base/snmp.pp11
-rw-r--r--manifests/profile/base/swift/proxy.pp15
-rw-r--r--manifests/profile/base/swift/ringbuilder.pp30
-rw-r--r--manifests/profile/base/swift/storage.pp1
-rw-r--r--manifests/profile/base/ui.pp24
-rw-r--r--manifests/profile/pacemaker/ceilometer.pp16
-rw-r--r--manifests/profile/pacemaker/ceilometer/api.pp5
-rw-r--r--manifests/profile/pacemaker/cinder/backup.pp60
-rw-r--r--manifests/profile/pacemaker/cinder/volume.pp6
-rw-r--r--manifests/profile/pacemaker/database/mysql.pp25
-rw-r--r--manifests/profile/pacemaker/database/redis.pp8
-rw-r--r--manifests/profile/pacemaker/haproxy.pp6
-rw-r--r--manifests/profile/pacemaker/manila.pp61
-rw-r--r--manifests/profile/pacemaker/rabbitmq.pp6
-rw-r--r--manifests/trusted_ca.pp39
-rw-r--r--manifests/trusted_cas.pp28
-rw-r--r--manifests/vip_hosts.pp39
-rw-r--r--metadata.json2
-rw-r--r--releasenotes/notes/sriov_numvfs-40564db9e1be589b.yaml4
-rw-r--r--spec/classes/tripleo_host_sriov_spec.rb39
-rw-r--r--spec/defines/tripleo_host_sriov_numvfs_persistence_spec.rb40
-rw-r--r--spec/unit/provider/sriov_vf_config/numvfs_spec.rb40
-rw-r--r--spec/unit/type/sriov_vf_config_spec.rb47
83 files changed, 1865 insertions, 210 deletions
diff --git a/lib/facter/alt_fqdns.rb b/lib/facter/alt_fqdns.rb
index 8a4d59b..216beef 100644
--- a/lib/facter/alt_fqdns.rb
+++ b/lib/facter/alt_fqdns.rb
@@ -14,9 +14,9 @@
# under the License.
[
'external',
- 'internalapi',
+ 'internal_api',
'storage',
- 'storagemgmt',
+ 'storage_mgmt',
'tenant',
'management',
].each do |network|
@@ -24,10 +24,21 @@
setcode do
external_hostname_parts = [
Facter.value(:hostname),
- network,
+ network.gsub('_', ''),
Facter.value(:domain),
].reject { |part| part.nil? || part.empty? }
external_hostname_parts.join(".")
end
end
end
+# map ctlplane network to management fqdn
+Facter.add('fqdn_ctlplane') do
+ setcode do
+ hostname_parts = [
+ Facter.value(:hostname),
+ 'management',
+ Facter.value(:domain),
+ ].reject { |part| part.nil? || part.empty? }
+ hostname_parts.join(".")
+ end
+end
diff --git a/lib/puppet/parser/functions/tripleo_swift_devices.rb b/lib/puppet/parser/functions/tripleo_swift_devices.rb
new file mode 100644
index 0000000..b320d62
--- /dev/null
+++ b/lib/puppet/parser/functions/tripleo_swift_devices.rb
@@ -0,0 +1,39 @@
+# Build Swift devices list from the parts, e.g. for:
+# raw_disk_prefix = 'r1z1-'
+# swift_storage_node_ips = ['192.168.1.12', '192.168.1.13']
+# raw_disks = [':%PORT%/device1', ':%PORT%/device2']
+#
+# devices will be ['r1z1-192.168.1.12:%PORT%/device1',
+# 'r1z1-192.168.1.12:%PORT%/device2'
+# 'r1z1-192.168.1.13:%PORT%/device1'
+# 'r1z1-192.168.1.13:%PORT%/device2']
+module Puppet::Parser::Functions
+ newfunction(:tripleo_swift_devices, :arity =>3, :type => :rvalue,
+ :doc => ("Build list of swift devices the TripleO way:" +
+ "from a raw disk prefix, a list of swift storage" +
+ "node IPs, and a list of raw disks.")) do |args|
+
+ raw_disk_prefix = args[0]
+ swift_node_ips = args[1]
+ raw_disks = args[2]
+
+ unless raw_disk_prefix.is_a?(String)
+ raise Puppet::ParseError, "tripleo_swift_devices: Argument 'raw_disk_prefix' must be a string. The value given was: #{raw_disk_prefix}"
+ end
+ unless swift_node_ips.is_a?(Array)
+ raise Puppet::ParseError, "tripleo_swift_devices: Argument 'swift_node_ips' must be an array. The value given was: #{swift_node_ips}"
+ end
+ unless raw_disks.is_a?(Array)
+ raise Puppet::ParseError, "tripleo_swift_devices: Argument 'raw_disks' must be an array. The value given was: #{raw_disks}"
+ end
+
+ devices = []
+ for ip in swift_node_ips do
+ for disk in raw_disks do
+ devices << "#{raw_disk_prefix}#{ip}#{disk}"
+ end
+ end
+
+ return devices
+ end
+end
diff --git a/lib/puppet/provider/sriov_vf_config/numvfs.rb b/lib/puppet/provider/sriov_vf_config/numvfs.rb
new file mode 100644
index 0000000..cfa663c
--- /dev/null
+++ b/lib/puppet/provider/sriov_vf_config/numvfs.rb
@@ -0,0 +1,57 @@
+Puppet::Type.type(:sriov_vf_config).provide(:numvfs) do
+ desc <<-EOT
+ The file /sys/class/net/<sriov_interface_name>/device/sriov_numvfs will be
+ present when a physical PCIe device supports SR-IOV. A number written to
+ this file will enable the specified number of VFs. This provider shall read
+ the file and ensure that the value is zero, before writing the number of
+ VFs that should be enabled. If the VFs needs to be disabled then we shall
+ write a zero to this file.
+ EOT
+
+ def create
+ if File.file?(sriov_numvfs_path)
+ _set_numvfs
+ else
+ fail("#{sriov_numvfs_path} doesn't exist. Check if #{sriov_get_interface} is a valid network interface supporting SR-IOV")
+ end
+ end
+
+ def destroy
+ if File.file?(sriov_numvfs_path)
+ File.write(sriov_numvfs_path,"0")
+ end
+ end
+
+ def exists?
+ if File.file?(sriov_numvfs_path)
+ cur_value = File.read(sriov_numvfs_path)
+ if cur_value.to_i == sriov_numvfs_value
+ return true
+ end
+ end
+ return false
+ end
+
+ def _set_numvfs
+ # During an update, the content of file sriov_numvfs_path has to be set
+ # to 0 (ZERO), before writing the actual value
+ cur_value = File.read(sriov_numvfs_path)
+ if cur_value != 0
+ File.write(sriov_numvfs_path,"0")
+ end
+ File.write(sriov_numvfs_path,sriov_numvfs_value)
+ end
+
+ def sriov_numvfs_path
+ "/sys/class/net/#{sriov_get_interface}/device/sriov_numvfs"
+ end
+
+ def sriov_get_interface
+ resource[:name].split(':', 2).first
+ end
+
+ def sriov_numvfs_value
+ resource[:name].split(':', 2).last.to_i
+ end
+
+end
diff --git a/lib/puppet/type/sriov_vf_config.rb b/lib/puppet/type/sriov_vf_config.rb
new file mode 100644
index 0000000..09a3671
--- /dev/null
+++ b/lib/puppet/type/sriov_vf_config.rb
@@ -0,0 +1,10 @@
+Puppet::Type.newtype(:sriov_vf_config) do
+
+ ensurable
+
+ newparam(:name) do
+ desc "sriov_numvfs conf as <physical_network>:<number_of_vfs> format"
+ newvalues(/^[a-z0-9\-_]+:[0-9]+$/)
+ end
+
+end
diff --git a/manifests/haproxy.pp b/manifests/haproxy.pp
index e2b2cc9..e1f5d50 100644
--- a/manifests/haproxy.pp
+++ b/manifests/haproxy.pp
@@ -111,99 +111,99 @@
#
# [*keystone_admin*]
# (optional) Enable or not Keystone Admin API binding
-# Defaults to false
+# Defaults to hiera('keystone_enabled', false)
#
# [*keystone_public*]
# (optional) Enable or not Keystone Public API binding
-# Defaults to false
+# Defaults to hiera('keystone_enabled', false)
#
# [*neutron*]
# (optional) Enable or not Neutron API binding
-# Defaults to false
+# Defaults to hiera('neutron_api_enabled', false)
#
# [*cinder*]
# (optional) Enable or not Cinder API binding
-# Defaults to false
+# Defaults to hiera('cinder_api_enabled', false)
#
# [*manila*]
# (optional) Enable or not Manila API binding
-# Defaults to false
+# Defaults to hiera('manila_api_enabled', false)
#
# [*sahara*]
# (optional) Enable or not Sahara API binding
-# defaults to false
+# defaults to hiera('sahara_api_enabled', false)
#
# [*trove*]
# (optional) Enable or not Trove API binding
-# defaults to false
+# defaults to hiera('trove_api_enabled', false)
#
# [*glance_api*]
# (optional) Enable or not Glance API binding
-# Defaults to false
+# Defaults to hiera('glance_api_enabled', false)
#
# [*glance_registry*]
# (optional) Enable or not Glance registry binding
-# Defaults to false
+# Defaults to hiera('glance_registry_enabled', false)
#
# [*nova_osapi*]
# (optional) Enable or not Nova API binding
-# Defaults to false
+# Defaults to hiera('nova_api_enabled', false)
#
# [*nova_metadata*]
# (optional) Enable or not Nova metadata binding
-# Defaults to false
+# Defaults to hiera('nova_api_enabled', false)
#
# [*nova_novncproxy*]
# (optional) Enable or not Nova novncproxy binding
-# Defaults to false
+# Defaults to hiera('nova_vncproxy_enabled', false)
#
# [*ceilometer*]
# (optional) Enable or not Ceilometer API binding
-# Defaults to false
+# Defaults to hiera('ceilometer_api_enabled', false)
#
# [*aodh*]
# (optional) Enable or not Aodh API binding
-# Defaults to false
+# Defaults to hiera('aodh_api_enabled', false)
#
# [*gnocchi*]
# (optional) Enable or not Gnocchi API binding
-# Defaults to false
+# Defaults to hiera('gnocchi_api_enabled', false)
#
# [*mistral*]
# (optional) Enable or not Mistral API binding
-# Defaults to false
+# Defaults to hiera('mistral_api_enabled', false)
#
# [*swift_proxy_server*]
# (optional) Enable or not Swift API binding
-# Defaults to false
+# Defaults to hiera('swift_proxy_enabled', false)
#
# [*heat_api*]
# (optional) Enable or not Heat API binding
-# Defaults to false
+# Defaults to hiera('heat_api_enabled', false)
#
# [*heat_cloudwatch*]
# (optional) Enable or not Heat Cloudwatch API binding
-# Defaults to false
+# Defaults to hiera('heat_api_cloudwatch_enabled', false)
#
# [*heat_cfn*]
# (optional) Enable or not Heat CFN API binding
-# Defaults to false
+# Defaults to hiera('heat_api_cfn_enabled', false)
#
# [*horizon*]
# (optional) Enable or not Horizon dashboard binding
-# Defaults to false
+# Defaults to hiera('horizon_enabled', false)
#
# [*ironic*]
# (optional) Enable or not Ironic API binding
-# Defaults to false
+# Defaults to hiera('ironic_enabled', false)
#
# [*ironic_inspector*]
# (optional) Enable or not Ironic Inspector API binding
-# Defaults to false
+# Defaults to hiera('ironic_inspector_enabled', false)
#
# [*mysql*]
# (optional) Enable or not MySQL Galera binding
-# Defaults to false
+# Defaults to hiera('mysql_enabled', false)
#
# [*mysql_clustercheck*]
# (optional) Enable check via clustercheck for mysql
@@ -215,7 +215,7 @@
#
# [*redis*]
# (optional) Enable or not Redis binding
-# Defaults to false
+# Defaults to hiera('redis_enabled', false)
#
# [*redis_password*]
# (optional) Password for Redis authentication, eventually needed by the
@@ -228,7 +228,15 @@
#
# [*zaqar_api*]
# (optional) Enable or not Zaqar Api binding
-# Defaults to false
+# Defaults to hiera('zaqar_api_enabled', false)
+#
+# [*ceph_rgw*]
+# (optional) Enable or not Ceph RadosGW binding
+# Defaults to hiera('ceph_rgw_enabled', false)
+#
+# [*opendaylight*]
+# (optional) Enable or not OpenDaylight binding
+# Defaults to hiera('opendaylight_api_enabled', false)
#
# [*service_ports*]
# (optional) Hash that contains the values to override from the service ports
@@ -277,6 +285,8 @@
# 'trove_api_ssl_port' (Defaults to 13779)
# 'zaqar_api_port' (Defaults to 8888)
# 'zaqar_api_ssl_port' (Defaults to 13888)
+# 'ceph_rgw_port' (Defaults to 8080)
+# 'ceph_rgw_ssl_port' (Defaults to 13808)
# Defaults to {}
#
class tripleo::haproxy (
@@ -299,36 +309,38 @@ class tripleo::haproxy (
$ssl_cipher_suite = '!SSLv2:kEECDH:kRSA:kEDH:kPSK:+3DES:!aNULL:!eNULL:!MD5:!EXP:!RC4:!SEED:!IDEA:!DES',
$ssl_options = 'no-sslv3',
$haproxy_stats_certificate = undef,
- $keystone_admin = false,
- $keystone_public = false,
- $neutron = false,
- $cinder = false,
- $sahara = false,
- $trove = false,
- $manila = false,
- $glance_api = false,
- $glance_registry = false,
- $nova_osapi = false,
- $nova_metadata = false,
- $nova_novncproxy = false,
- $ceilometer = false,
- $aodh = false,
- $gnocchi = false,
- $mistral = false,
- $swift_proxy_server = false,
- $heat_api = false,
- $heat_cloudwatch = false,
- $heat_cfn = false,
- $horizon = false,
- $ironic = false,
- $ironic_inspector = false,
- $mysql = false,
+ $keystone_admin = hiera('keystone_enabled', false),
+ $keystone_public = hiera('keystone_enabled', false),
+ $neutron = hiera('neutron_api_enabled', false),
+ $cinder = hiera('cinder_api_enabled', false),
+ $manila = hiera('manila_api_enabled', false),
+ $sahara = hiera('sahara_api_enabled', false),
+ $trove = hiera('trove_api_enabled', false),
+ $glance_api = hiera('glance_api_enabled', false),
+ $glance_registry = hiera('glance_registry_enabled', false),
+ $nova_osapi = hiera('nova_api_enabled', false),
+ $nova_metadata = hiera('nova_api_enabled', false),
+ $nova_novncproxy = hiera('nova_vncproxy_enabled', false),
+ $ceilometer = hiera('ceilometer_api_enabled', false),
+ $aodh = hiera('aodh_api_enabled', false),
+ $gnocchi = hiera('gnocchi_api_enabled', false),
+ $mistral = hiera('mistral_api_enabled', false),
+ $swift_proxy_server = hiera('swift_proxy_enabled', false),
+ $heat_api = hiera('heat_api_enabled', false),
+ $heat_cloudwatch = hiera('heat_api_cloudwatch_enabled', false),
+ $heat_cfn = hiera('heat_api_cfn_enabled', false),
+ $horizon = hiera('horizon_enabled', false),
+ $ironic = hiera('ironic_api_enabled', false),
+ $ironic_inspector = hiera('ironic_inspector_enabled', false),
+ $mysql = hiera('mysql_enabled', false),
$mysql_clustercheck = false,
$rabbitmq = false,
- $redis = false,
+ $redis = hiera('redis_enabled', false),
$redis_password = undef,
$midonet_api = false,
- $zaqar_api = false,
+ $zaqar_api = hiera('zaqar_api_enabled', false),
+ $ceph_rgw = hiera('ceph_rgw_enabled', false),
+ $opendaylight = hiera('opendaylight_api_enabled', false),
$service_ports = {}
) {
$default_service_ports = {
@@ -376,6 +388,8 @@ class tripleo::haproxy (
trove_api_ssl_port => 13779,
zaqar_api_port => 8888,
zaqar_api_ssl_port => 13888,
+ ceph_rgw_port => 8080,
+ ceph_rgw_ssl_port => 13808,
}
$ports = merge($default_service_ports, $service_ports)
@@ -881,7 +895,12 @@ class tripleo::haproxy (
options => {
'balance' => 'first',
'option' => ['tcp-check',],
- 'tcp-check' => union($redis_tcp_check_options, ['send PING\r\n','expect string +PONG','send info\ replication\r\n','expect string role:master','send QUIT\r\n','expect string +OK']),
+ 'tcp-check' => union($redis_tcp_check_options, ['send PING\r\n',
+ 'expect string +PONG',
+ 'send info\ replication\r\n',
+ 'expect string role:master',
+ 'send QUIT\r\n',
+ 'expect string +OK']),
},
collect_exported => false,
}
@@ -924,4 +943,38 @@ class tripleo::haproxy (
public_ssl_port => $ports[zaqar_api_ssl_port],
}
}
+
+ if $ceph_rgw {
+ ::tripleo::haproxy::endpoint { 'ceph_rgw':
+ public_virtual_ip => $public_virtual_ip,
+ internal_ip => hiera('ceph_rgw_vip', $controller_virtual_ip),
+ service_port => $ports[ceph_rgw_port],
+ ip_addresses => hiera('ceph_rgw_node_ips', $controller_hosts_real),
+ server_names => $controller_hosts_names_real,
+ public_ssl_port => $ports[ceph_rgw_ssl_port],
+ }
+ }
+
+ $opendaylight_api_vip = hiera('opendaylight_api_vip', $controller_virtual_ip)
+ $opendaylight_bind_opts = {
+ "${opendaylight_api_vip}:8081" => [],
+ "${public_virtual_ip}:8081" => [],
+ }
+
+ if $opendaylight {
+ haproxy::listen { 'opendaylight':
+ bind => $opendaylight_bind_opts,
+ options => {
+ 'balance' => 'source',
+ },
+ collect_exported => false,
+ }
+ haproxy::balancermember { 'opendaylight':
+ listening_service => 'opendaylight',
+ ports => '8081',
+ ipaddresses => hiera('opendaylight_api_node_ips', $controller_hosts_real),
+ server_names => $controller_hosts_names_real,
+ options => ['check', 'inter 2000', 'rise 2', 'fall 5'],
+ }
+ }
}
diff --git a/manifests/haproxy/endpoint.pp b/manifests/haproxy/endpoint.pp
index ac6cb6c..b7403a4 100644
--- a/manifests/haproxy/endpoint.pp
+++ b/manifests/haproxy/endpoint.pp
@@ -88,7 +88,8 @@ define tripleo::haproxy::endpoint (
# service exposed to the public network
if $public_certificate {
- $public_bind_opts = list_to_hash(suffix(any2array($public_virtual_ip), ":${public_ssl_port}"), union($haproxy_listen_bind_param, ['ssl', 'crt', $public_certificate]))
+ $public_bind_opts = list_to_hash(suffix(any2array($public_virtual_ip), ":${public_ssl_port}"),
+ union($haproxy_listen_bind_param, ['ssl', 'crt', $public_certificate]))
} else {
$public_bind_opts = list_to_hash(suffix(any2array($public_virtual_ip), ":${service_port}"), $haproxy_listen_bind_param)
}
@@ -98,7 +99,8 @@ define tripleo::haproxy::endpoint (
}
if $internal_certificate {
- $internal_bind_opts = list_to_hash(suffix(any2array($internal_ip), ":${service_port}"), union($haproxy_listen_bind_param, ['ssl', 'crt', $public_certificate]))
+ $internal_bind_opts = list_to_hash(suffix(any2array($internal_ip), ":${service_port}"),
+ union($haproxy_listen_bind_param, ['ssl', 'crt', $public_certificate]))
} else {
$internal_bind_opts = list_to_hash(suffix(any2array($internal_ip), ":${service_port}"), $haproxy_listen_bind_param)
}
diff --git a/manifests/host/sriov.pp b/manifests/host/sriov.pp
new file mode 100644
index 0000000..a30db42
--- /dev/null
+++ b/manifests/host/sriov.pp
@@ -0,0 +1,27 @@
+# == Class: tripleo::host::sriov
+#
+# Configures host configuration for the SR-IOV interfaces
+#
+# === Parameters
+#
+# [*number_of_vfs*]
+# (optional) List of <physical_network>:<number_of_vfs> specifying the number
+# VFs to be exposed per physical interface.
+# For example, to configure two interface with number of VFs, specify
+# it as ['eth1:4','eth2:10']
+# Defaults to []
+#
+class tripleo::host::sriov (
+ $number_of_vfs = [],
+) {
+
+ if !empty($number_of_vfs) {
+ sriov_vf_config { $number_of_vfs: ensure => present }
+
+ # the numvfs configuration needs to be persisted for every boot
+ tripleo::host::sriov::numvfs_persistence {'persistent_numvfs':
+ vf_defs => $number_of_vfs,
+ content_string => "#!/bin/bash\n"
+ }
+ }
+}
diff --git a/manifests/host/sriov/numvfs_persistence.pp b/manifests/host/sriov/numvfs_persistence.pp
new file mode 100644
index 0000000..1ee402c
--- /dev/null
+++ b/manifests/host/sriov/numvfs_persistence.pp
@@ -0,0 +1,55 @@
+#
+# tripleo::host::sriov::numvfs_persistence used by tripleo::host::sriov
+#
+# === Parameters:
+#
+# [*vf_defs*]
+# (required) Array of of <physical_interface>:<numvfs>.
+# Example: ['eth1:10','eth2:8']
+#
+# [*content_string*]
+# (required) String which shall be written to the script file.
+#
+define tripleo::host::sriov::numvfs_persistence(
+ $vf_defs,
+ $content_string
+){
+ # Since reduce isn't available, we use recursion to iterate each entries of
+ # "physical_interface:vfs" and accumulate the content that needs to be
+ # written to the script file.
+ include ::stdlib
+
+ if empty($vf_defs) {
+ file { '/etc/sysconfig/allocate_vfs':
+ ensure => file,
+ content => $content_string,
+ group => 'root',
+ mode => '0755',
+ owner => 'root',
+ }
+
+ file { '/sbin/ifup-local':
+ group => 'root',
+ mode => '0755',
+ owner => 'root',
+ content => '#!/bin/bash',
+ replace => false
+ }
+
+ file_line { 'call_ifup-local':
+ path => '/sbin/ifup-local',
+ line => '/etc/sysconfig/allocate_vfs $1',
+ require => File['/sbin/ifup-local'],
+ }
+ } else {
+ $vfspec = split($vf_defs[0], ':')
+ $interface = $vfspec[0]
+ $count = $vfspec[1]
+ $vfdef_str = "${content_string}[ \"${interface}\" == \"\$1\" ] && echo ${count} > /sys/class/net/${interface}/device/sriov_numvfs\n"
+ tripleo::host::sriov::numvfs_persistence{"mapped ${interface}":
+ vf_defs => delete_at($vf_defs, 0),
+ content_string => $vfdef_str
+ }
+ }
+}
+
diff --git a/manifests/keepalived.pp b/manifests/keepalived.pp
index 45d772e..c0fb3ef 100644
--- a/manifests/keepalived.pp
+++ b/manifests/keepalived.pp
@@ -54,6 +54,11 @@
# A string.
# Defaults to false
#
+# [*redis_virtual_ip*]
+# Virtual IP on the redis service.
+# A string.
+# Defaults to false
+#
class tripleo::keepalived (
$controller_virtual_ip,
$control_virtual_interface,
@@ -62,6 +67,7 @@ class tripleo::keepalived (
$internal_api_virtual_ip = false,
$storage_virtual_ip = false,
$storage_mgmt_virtual_ip = false,
+ $redis_virtual_ip = false,
) {
case $::osfamily {
@@ -141,4 +147,16 @@ class tripleo::keepalived (
}
}
+ if $redis_virtual_ip and $redis_virtual_ip != $controller_virtual_ip {
+ $redis_virtual_interface = interface_for_ip($redis_virtual_ip)
+ # KEEPALIVE STORAGE MANAGEMENT NETWORK
+ keepalived::instance { '56':
+ interface => $redis_virtual_interface,
+ virtual_ips => [join([$redis_virtual_ip, ' dev ', $redis_virtual_interface])],
+ state => 'MASTER',
+ track_script => ['haproxy'],
+ priority => 101,
+ }
+ }
+
}
diff --git a/manifests/pacemaker/resource_restart_flag.pp b/manifests/pacemaker/resource_restart_flag.pp
new file mode 100644
index 0000000..aded802
--- /dev/null
+++ b/manifests/pacemaker/resource_restart_flag.pp
@@ -0,0 +1,35 @@
+# Copyright 2016 Red Hat, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+# == Define: tripleo::pacemaker::resource_restart_flag
+#
+# Creates a flag file on the filesystem to signify that a pacemaker
+# resource needs restarting (usually to pick up config changes after
+# they've been written on all nodes).
+#
+# === Parameters
+#
+# [*title*]
+# The resource name in Pacemaker to restart. If it's a cloned
+# resource, the name should include the '-clone' part.
+#
+define tripleo::pacemaker::resource_restart_flag() {
+
+ exec { "${title} resource restart flag":
+ command => "touch /var/lib/tripleo/pacemaker-restarts/${title}",
+ path => ['/bin','/usr/bin','/sbin','/usr/sbin'],
+ refreshonly => true,
+ }
+
+}
diff --git a/manifests/profile/base/aodh.pp b/manifests/profile/base/aodh.pp
index 28156a0..2fad5b3 100644
--- a/manifests/profile/base/aodh.pp
+++ b/manifests/profile/base/aodh.pp
@@ -27,9 +27,15 @@
# (Optional) The hostname of the node responsible for bootstrapping tasks
# Defaults to hiera('bootstrap_nodeid')
#
+# [*rabbit_hosts*]
+# list of the rabbbit host IPs
+# Defaults to hiera('rabbitmq_node_ips')
+#
+
class tripleo::profile::base::aodh (
$step = hiera('step'),
$bootstrap_node = hiera('bootstrap_nodeid', undef),
+ $rabbit_hosts = hiera('rabbitmq_node_ips', undef),
) {
if $::hostname == downcase($bootstrap_node) {
@@ -42,8 +48,10 @@ class tripleo::profile::base::aodh (
include ::aodh::db::mysql
}
- if $step >= 4 and $sync_db {
- include ::aodh
+ if $step >= 4 or ($step >= 3 and $sync_db) {
+ class { '::aodh' :
+ rabbit_hosts => $rabbit_hosts,
+ }
include ::aodh::auth
include ::aodh::config
include ::aodh::client
diff --git a/manifests/profile/base/aodh/api.pp b/manifests/profile/base/aodh/api.pp
index 3aa436d..2dcf802 100644
--- a/manifests/profile/base/aodh/api.pp
+++ b/manifests/profile/base/aodh/api.pp
@@ -23,25 +23,27 @@
# for more details.
# Defaults to hiera('step')
#
-# [*bootstrap_node*]
-# (Optional) The hostname of the node responsible for bootstrapping tasks
-# Defaults to hiera('bootstrap_nodeid')
+# [*enable_combination_alarms*]
+# (optional) Setting to enable combination alarms
+# Defaults to: false
#
+
class tripleo::profile::base::aodh::api (
- $step = hiera('step'),
- $bootstrap_node = hiera('bootstrap_nodeid', undef),
+ $step = hiera('step'),
+ $enable_combination_alarms = false,
) {
- if $::hostname == downcase($bootstrap_node) {
- $sync_db = true
- } else {
- $sync_db = false
- }
-
include ::tripleo::profile::base::aodh
- if $step >= 4 and $sync_db {
+ if $step >= 4 {
include ::aodh::api
include ::aodh::wsgi::apache
+
+ #NOTE: Combination alarms are deprecated in newton and disabled by default.
+ # we need a way to override this setting for users still using this type
+ # of alarms.
+ aodh_config {
+ 'api/enable_combination_alarms' : value => $enable_combination_alarms;
+ }
}
}
diff --git a/manifests/profile/base/aodh/evaluator.pp b/manifests/profile/base/aodh/evaluator.pp
index 46d1d14..610d5a8 100644
--- a/manifests/profile/base/aodh/evaluator.pp
+++ b/manifests/profile/base/aodh/evaluator.pp
@@ -23,24 +23,13 @@
# for more details.
# Defaults to hiera('step')
#
-# [*bootstrap_node*]
-# (Optional) The hostname of the node responsible for bootstrapping tasks
-# Defaults to hiera('bootstrap_nodeid')
-#
class tripleo::profile::base::aodh::evaluator (
- $step = hiera('step'),
- $bootstrap_node = hiera('bootstrap_nodeid', undef),
+ $step = hiera('step'),
) {
- if $::hostname == downcase($bootstrap_node) {
- $sync_db = true
- } else {
- $sync_db = false
- }
-
include ::tripleo::profile::base::aodh
- if $step >= 4 and $sync_db {
+ if $step >= 4 {
include ::aodh::evaluator
}
diff --git a/manifests/profile/base/aodh/listener.pp b/manifests/profile/base/aodh/listener.pp
index 93f37fa..d36e1bb 100644
--- a/manifests/profile/base/aodh/listener.pp
+++ b/manifests/profile/base/aodh/listener.pp
@@ -23,24 +23,13 @@
# for more details.
# Defaults to hiera('step')
#
-# [*bootstrap_node*]
-# (Optional) The hostname of the node responsible for bootstrapping tasks
-# Defaults to hiera('bootstrap_nodeid')
-#
class tripleo::profile::base::aodh::listener (
- $step = hiera('step'),
- $bootstrap_node = hiera('bootstrap_nodeid', undef),
+ $step = hiera('step'),
) {
- if $::hostname == downcase($bootstrap_node) {
- $sync_db = true
- } else {
- $sync_db = false
- }
-
include ::tripleo::profile::base::aodh
- if $step >= 4 and $sync_db {
+ if $step >= 4 {
include ::aodh::listener
}
diff --git a/manifests/profile/base/aodh/notifier.pp b/manifests/profile/base/aodh/notifier.pp
index 0686012..d2a3945 100644
--- a/manifests/profile/base/aodh/notifier.pp
+++ b/manifests/profile/base/aodh/notifier.pp
@@ -23,24 +23,13 @@
# for more details.
# Defaults to hiera('step')
#
-# [*bootstrap_node*]
-# (Optional) The hostname of the node responsible for bootstrapping tasks
-# Defaults to hiera('bootstrap_nodeid')
-#
class tripleo::profile::base::aodh::notifier (
- $step = hiera('step'),
- $bootstrap_node = hiera('bootstrap_nodeid', undef),
+ $step = hiera('step'),
) {
- if $::hostname == downcase($bootstrap_node) {
- $sync_db = true
- } else {
- $sync_db = false
- }
-
include ::tripleo::profile::base::aodh
- if $step >= 4 and $sync_db {
+ if $step >= 4 {
include ::aodh::notifier
}
diff --git a/manifests/profile/base/ceilometer.pp b/manifests/profile/base/ceilometer.pp
index 88818de..aaf904f 100644
--- a/manifests/profile/base/ceilometer.pp
+++ b/manifests/profile/base/ceilometer.pp
@@ -23,12 +23,19 @@
# for more details.
# Defaults to hiera('step')
#
+# [*rabbit_hosts*]
+# list of the rabbbit host IPs
+# Defaults to hiera('rabbitmq_node_ips')
+
class tripleo::profile::base::ceilometer (
$step = hiera('step'),
+ $rabbit_hosts = hiera('rabbitmq_node_ips', undef),
) {
if $step >= 3 {
- include ::ceilometer
+ class { '::ceilometer' :
+ rabbit_hosts => $rabbit_hosts,
+ }
include ::ceilometer::config
}
diff --git a/manifests/profile/base/ceilometer/api.pp b/manifests/profile/base/ceilometer/api.pp
index b300a91..da94da2 100644
--- a/manifests/profile/base/ceilometer/api.pp
+++ b/manifests/profile/base/ceilometer/api.pp
@@ -30,6 +30,6 @@ class tripleo::profile::base::ceilometer::api (
if $step >= 4 {
include ::ceilometer::api
+ include ::ceilometer::wsgi::apache
}
-
}
diff --git a/manifests/profile/base/ceilometer/collector.pp b/manifests/profile/base/ceilometer/collector.pp
index a8ca88b..baaf4c8 100644
--- a/manifests/profile/base/ceilometer/collector.pp
+++ b/manifests/profile/base/ceilometer/collector.pp
@@ -44,12 +44,12 @@ class tripleo::profile::base::ceilometer::collector (
# without the brackets as 'members' argument for the 'mongodb_replset'
# resource.
if str2bool(hiera('mongodb::server::ipv6', false)) {
- $mongo_node_ips_with_port_prefixed = prefix(hiera('mongo_node_ips'), '[')
+ $mongo_node_ips_with_port_prefixed = prefix(hiera('mongodb_node_ips'), '[')
$mongo_node_ips_with_port = suffix($mongo_node_ips_with_port_prefixed, ']:27017')
- $mongo_node_ips_with_port_nobr = suffix(hiera('mongo_node_ips'), ':27017')
+ $mongo_node_ips_with_port_nobr = suffix(hiera('mongodb_node_ips'), ':27017')
} else {
- $mongo_node_ips_with_port = suffix(hiera('mongo_node_ips'), ':27017')
- $mongo_node_ips_with_port_nobr = suffix(hiera('mongo_node_ips'), ':27017')
+ $mongo_node_ips_with_port = suffix(hiera('mongodb_node_ips'), ':27017')
+ $mongo_node_ips_with_port_nobr = suffix(hiera('mongodb_node_ips'), ':27017')
}
$mongo_node_string = join($mongo_node_ips_with_port, ',')
diff --git a/manifests/profile/base/ceilometer/expirer.pp b/manifests/profile/base/ceilometer/expirer.pp
index 0830307..eaaaefc 100644
--- a/manifests/profile/base/ceilometer/expirer.pp
+++ b/manifests/profile/base/ceilometer/expirer.pp
@@ -30,7 +30,8 @@ class tripleo::profile::base::ceilometer::expirer (
if $step >= 4 {
include ::ceilometer::expirer
- Cron <| title == 'ceilometer-expirer' |> { command => "sleep $((\$(od -A n -t d -N 3 /dev/urandom) % 86400)) && ${::ceilometer::params::expirer_command}" }
+ Cron <| title == 'ceilometer-expirer' |>
+ { command => "sleep $((\$(od -A n -t d -N 3 /dev/urandom) % 86400)) && ${::ceilometer::params::expirer_command}" }
}
}
diff --git a/manifests/profile/base/ceph.pp b/manifests/profile/base/ceph.pp
index 94166ac..6ffd4ef 100644
--- a/manifests/profile/base/ceph.pp
+++ b/manifests/profile/base/ceph.pp
@@ -18,22 +18,13 @@
#
# === Parameters
#
-# [*ceph_ipv6*]
-# (Optional) Force daemons to bind on IPv6 addresses
-# Defaults to false
-#
# [*ceph_mon_initial_members*]
# (Optional) List of IP addresses to use as mon_initial_members
-# Defaults to undef
+# Defaults to hiera('ceph_mon_node_names')
#
# [*ceph_mon_host*]
# (Optional) List of IP addresses to use as mon_host
-# Deftauls to undef
-#
-# [*ceph_mon_host_v6*]
-# (Optional) List of IPv6 addresses, surrounded by brackets, used as
-# mon_host when ceph_ipv6 is true
-# Defaults to undef
+# Deftauls to hiera('ceph_mon_node_ips')
#
# [*enable_ceph_storage*]
# (Optional) enable_ceph_storage
@@ -45,22 +36,29 @@
# Defaults to hiera('step')
#
class tripleo::profile::base::ceph (
- $ceph_ipv6 = false,
- $ceph_mon_initial_members = undef,
- $ceph_mon_host = undef,
- $ceph_mon_host_v6 = undef,
+ $ceph_mon_initial_members = hiera('ceph_mon_node_names', undef),
+ $ceph_mon_host = hiera('ceph_mon_node_ips', '127.0.0.1'),
$enable_ceph_storage = false,
$step = hiera('step'),
) {
if $step >= 2 {
if $ceph_mon_initial_members {
- $mon_initial_members = downcase($ceph_mon_initial_members)
+ if is_array($ceph_mon_initial_members) {
+ $mon_initial_members = downcase(join($ceph_mon_initial_members, ','))
+ } else {
+ $mon_initial_members = downcase($ceph_mon_initial_members)
+ }
} else {
$mon_initial_members = undef
}
- if $ceph_ipv6 {
- $mon_host = $ceph_mon_host_v6
+
+ if is_array($ceph_mon_host) {
+ if is_ipv6_address($ceph_mon_host[0]) {
+ $mon_host = join(enclose_ipv6($ceph_mon_host), ',')
+ } else {
+ $mon_host = join($ceph_mon_host, ',')
+ }
} else {
$mon_host = $ceph_mon_host
}
diff --git a/manifests/profile/base/ceph/rgw.pp b/manifests/profile/base/ceph/rgw.pp
new file mode 100644
index 0000000..7cd2b6a
--- /dev/null
+++ b/manifests/profile/base/ceph/rgw.pp
@@ -0,0 +1,63 @@
+# Copyright 2016 Red Hat, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+# == Class: tripleo::profile::base::ceph::rgw
+#
+# Ceph RadosGW profile for tripleo
+#
+# === Parameters
+#
+# [*keystone_admin_token*]
+# The keystone admin token
+#
+# [*keystone_url*]
+# The internal or admin url for keystone
+#
+# [*rgw_key*]
+# The cephx key for the RGW client service
+#
+# [*step*]
+# (Optional) The current step in deployment. See tripleo-heat-templates
+# for more details.
+# Defaults to hiera('step')
+#
+class tripleo::profile::base::ceph::rgw (
+ $keystone_admin_token,
+ $keystone_url,
+ $rgw_key,
+ $step = hiera('step'),
+) {
+
+ include ::tripleo::profile::base::ceph
+
+ if $step >= 3 {
+ include ::ceph::profile::rgw
+ $rgw_name = hiera('ceph::profile::params::rgw_name', 'radosgw.gateway')
+ ceph::key { "client.${rgw_name}":
+ secret => $rgw_key,
+ cap_mon => 'allow *',
+ cap_osd => 'allow *',
+ inject => true,
+ }
+ }
+
+ if $step >= 4 {
+ ceph::rgw::keystone { $rgw_name:
+ rgw_keystone_accepted_roles => ['admin', '_member_', 'Member'],
+ use_pki => false,
+ rgw_keystone_admin_token => $keystone_admin_token,
+ rgw_keystone_url => $keystone_url,
+ }
+ }
+}
diff --git a/manifests/profile/base/cinder.pp b/manifests/profile/base/cinder.pp
index 43d95b4..510ea40 100644
--- a/manifests/profile/base/cinder.pp
+++ b/manifests/profile/base/cinder.pp
@@ -30,10 +30,15 @@
# (Optional) The current step of the deployment
# Defaults to hiera('step')
#
+# [*rabbit_hosts*]
+# list of the rabbbit host IPs
+# Defaults to hiera('rabbitmq_node_ips')
+
class tripleo::profile::base::cinder (
$bootstrap_node = hiera('bootstrap_nodeid', undef),
$cinder_enable_db_purge = true,
$step = hiera('step'),
+ $rabbit_hosts = hiera('rabbitmq_node_ips', undef),
) {
if $::hostname == downcase($bootstrap_node) {
$sync_db = true
@@ -42,7 +47,9 @@ class tripleo::profile::base::cinder (
}
if $step >= 4 or ($step >= 3 and $sync_db) {
- include ::cinder
+ class { '::cinder' :
+ rabbit_hosts => $rabbit_hosts,
+ }
include ::cinder::config
}
diff --git a/manifests/profile/base/monitoring/fluentd.pp b/manifests/profile/base/cinder/backup.pp
index 8160452..df015f7 100644
--- a/manifests/profile/base/monitoring/fluentd.pp
+++ b/manifests/profile/base/cinder/backup.pp
@@ -12,28 +12,25 @@
# License for the specific language governing permissions and limitations
# under the License.
#
-# == Class: tripleo::profile::base::monitoring::fluentd
+# == Class: tripleo::profile::base::cinder::backup
#
-# FluentD configuration for TripleO
+# Cinder Backup profile for tripleo
#
# === Parameters
#
# [*step*]
-# (Optional) String. The current step of the deployment
+# (Optional) The current step in deployment. See tripleo-heat-templates
+# for more details.
# Defaults to hiera('step')
#
-class tripleo::profile::base::monitoring::fluentd (
- $step = hiera('step', undef)
+class tripleo::profile::base::cinder::backup (
+ $step = hiera('step'),
) {
- if $step == undef or $step >= 3 {
- include ::fluentd
- ::fluentd::plugin { 'rubygem-fluent-plugin-add':
- plugin_provider => 'yum',
- }
+ include ::tripleo::profile::base::cinder
- ::fluentd::plugin { 'rubygem-fluent-plugin-elasticsearch':
- plugin_provider => 'yum',
- }
+ if $step >= 4 {
+ include ::cinder::backup
}
+
}
diff --git a/manifests/profile/base/cinder/backup/ceph.pp b/manifests/profile/base/cinder/backup/ceph.pp
new file mode 100644
index 0000000..67a666e
--- /dev/null
+++ b/manifests/profile/base/cinder/backup/ceph.pp
@@ -0,0 +1,36 @@
+# Copyright 2016 Red Hat, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+# == Class: tripleo::profile::base::cinder::backup::ceph
+#
+# Cinder Backup Ceph profile for tripleo
+#
+# === Parameters
+#
+# [*step*]
+# (Optional) The current step in deployment. See tripleo-heat-templates
+# for more details.
+# Defaults to hiera('step')
+#
+class tripleo::profile::base::cinder::backup::ceph (
+ $step = hiera('step'),
+) {
+
+ include ::tripleo::profile::base::cinder::backup
+
+ if $step >= 4 {
+ include ::cinder::backup::ceph
+ }
+
+}
diff --git a/manifests/profile/base/cinder/backup/swift.pp b/manifests/profile/base/cinder/backup/swift.pp
new file mode 100644
index 0000000..12561bf
--- /dev/null
+++ b/manifests/profile/base/cinder/backup/swift.pp
@@ -0,0 +1,36 @@
+# Copyright 2016 Red Hat, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+# == Class: tripleo::profile::base::cinder::backup::swift
+#
+# Cinder Backup Ceph profile for tripleo
+#
+# === Parameters
+#
+# [*step*]
+# (Optional) The current step in deployment. See tripleo-heat-templates
+# for more details.
+# Defaults to hiera('step')
+#
+class tripleo::profile::base::cinder::backup::swift (
+ $step = hiera('step'),
+) {
+
+ include ::tripleo::profile::base::cinder::backup
+
+ if $step >= 4 {
+ include ::cinder::backup::swift
+ }
+
+}
diff --git a/manifests/profile/base/cinder/volume.pp b/manifests/profile/base/cinder/volume.pp
index dfb034f..7d562ec 100644
--- a/manifests/profile/base/cinder/volume.pp
+++ b/manifests/profile/base/cinder/volume.pp
@@ -108,7 +108,13 @@ class tripleo::profile::base::cinder::volume (
$cinder_rbd_backend_name = undef
}
- $cinder_enabled_backends = delete_undef_values([$cinder_iscsi_backend_name, $cinder_rbd_backend_name, $cinder_eqlx_backend_name, $cinder_dellsc_backend_name, $cinder_netapp_backend_name, $cinder_nfs_backend_name, $cinder_user_enabled_backends])
+ $cinder_enabled_backends = delete_undef_values([$cinder_iscsi_backend_name,
+ $cinder_rbd_backend_name,
+ $cinder_eqlx_backend_name,
+ $cinder_dellsc_backend_name,
+ $cinder_netapp_backend_name,
+ $cinder_nfs_backend_name,
+ $cinder_user_enabled_backends])
class { '::cinder::backends' :
enabled_backends => $cinder_enabled_backends,
}
diff --git a/manifests/profile/base/cinder/volume/iscsi.pp b/manifests/profile/base/cinder/volume/iscsi.pp
index d1d22bb..8baaf1c 100644
--- a/manifests/profile/base/cinder/volume/iscsi.pp
+++ b/manifests/profile/base/cinder/volume/iscsi.pp
@@ -52,8 +52,11 @@ class tripleo::profile::base::cinder::volume::iscsi (
size => join([$cinder_lvm_loop_device_size, 'M']),
}
+ # NOTE(gfidente): never emit in hieradata:
+ # key: [ipv6]
+ # as it will cause hiera parsing errors
cinder::backend::iscsi { $backend_name :
- iscsi_ip_address => $cinder_iscsi_address,
+ iscsi_ip_address => normalize_ip_for_uri($cinder_iscsi_address),
iscsi_helper => $cinder_iscsi_helper,
}
}
diff --git a/manifests/profile/base/database/mongodbcommon.pp b/manifests/profile/base/database/mongodbcommon.pp
index 13af899..c61e692 100644
--- a/manifests/profile/base/database/mongodbcommon.pp
+++ b/manifests/profile/base/database/mongodbcommon.pp
@@ -27,7 +27,7 @@
#
class tripleo::profile::base::database::mongodbcommon (
$mongodb_ipv6_enabled = false,
- $mongodb_node_ips = hiera('mongo_node_ips'),
+ $mongodb_node_ips = hiera('mongodb_node_ips'),
) {
$port = '27017'
diff --git a/manifests/profile/base/glance/api.pp b/manifests/profile/base/glance/api.pp
index 845fd41..ecffd7f 100644
--- a/manifests/profile/base/glance/api.pp
+++ b/manifests/profile/base/glance/api.pp
@@ -27,9 +27,14 @@
# for more details.
# Defaults to hiera('step')
#
+# [*rabbit_hosts*]
+# list of the rabbbit host IPs
+# Defaults to hiera('rabbitmq_node_ips')
+
class tripleo::profile::base::glance::api (
$glance_backend = downcase(hiera('glance_backend', 'swift')),
$step = hiera('step'),
+ $rabbit_hosts = hiera('rabbitmq_node_ips', undef),
) {
if $step >= 4 {
@@ -48,7 +53,9 @@ class tripleo::profile::base::glance::api (
class { '::glance::api':
stores => $glance_store,
}
- include ::glance::notify::rabbitmq
+ class { '::glance::notify::rabbitmq' :
+ rabbit_hosts => $rabbit_hosts,
+ }
include join(['::glance::backend::', $glance_backend])
}
diff --git a/manifests/profile/base/gnocchi/metricd.pp b/manifests/profile/base/gnocchi/metricd.pp
index 4d7eb89..e69bbd5 100644
--- a/manifests/profile/base/gnocchi/metricd.pp
+++ b/manifests/profile/base/gnocchi/metricd.pp
@@ -28,7 +28,9 @@ class tripleo::profile::base::gnocchi::metricd (
) {
include ::tripleo::profile::base::gnocchi
- if $step >= 4 {
+ if $step >= 5 {
include ::gnocchi::metricd
+ Keystone_endpoint<||> -> Service['gnocchi-metricd']
+ Keystone_user_role<||> -> Service['gnocchi-metricd']
}
}
diff --git a/manifests/profile/base/gnocchi/statsd.pp b/manifests/profile/base/gnocchi/statsd.pp
index 775b043..1fe4067 100644
--- a/manifests/profile/base/gnocchi/statsd.pp
+++ b/manifests/profile/base/gnocchi/statsd.pp
@@ -28,7 +28,9 @@ class tripleo::profile::base::gnocchi::statsd (
) {
include ::tripleo::profile::base::gnocchi
- if $step >= 4 {
+ if $step >= 5 {
include ::gnocchi::statsd
+ Keystone_endpoint<||> -> Service['gnocchi-statsd']
+ Keystone_user_role<||> -> Service['gnocchi-statsd']
}
}
diff --git a/manifests/profile/base/haproxy.pp b/manifests/profile/base/haproxy.pp
index 4f2f850..68ff3e4 100644
--- a/manifests/profile/base/haproxy.pp
+++ b/manifests/profile/base/haproxy.pp
@@ -82,6 +82,20 @@ class tripleo::profile::base::haproxy (
}
include ::tripleo::haproxy
+
+ unless hiera('tripleo::haproxy::haproxy_service_manage', true) {
+ # Reload HAProxy configuration if the haproxy class has refreshed or any
+ # HAProxy frontend endpoint has changed.
+ exec { 'haproxy-reload':
+ command => 'systemctl reload haproxy',
+ path => ['/usr/bin', '/usr/sbin'],
+ refreshonly => true,
+ onlyif => 'pcs property | grep -q "maintenance-mode.*true"',
+ subscribe => Class['::haproxy']
+ }
+ Haproxy::Listen<||> ~> Exec['haproxy-reload']
+ Haproxy::Balancermember<||> ~> Exec['haproxy-reload']
+ }
}
}
diff --git a/manifests/profile/base/heat.pp b/manifests/profile/base/heat.pp
index dcf0f21..027ab7e 100644
--- a/manifests/profile/base/heat.pp
+++ b/manifests/profile/base/heat.pp
@@ -35,11 +35,16 @@
# for more details.
# Defaults to hiera('step')
#
+# [*rabbit_hosts*]
+# list of the rabbbit host IPs
+# Defaults to hiera('rabbitmq_node_ips')
+
class tripleo::profile::base::heat (
$bootstrap_node = downcase(hiera('bootstrap_nodeid')),
$manage_db_purge = hiera('heat_enable_db_purge', true),
$notification_driver = 'messaging',
$step = hiera('step'),
+ $rabbit_hosts = hiera('rabbitmq_node_ips', undef),
) {
# Domain resources will be created at step5 on the bootstrap_node so we
# configure heat.conf at step3 and 4 but actually create the domain later.
@@ -54,8 +59,10 @@ class tripleo::profile::base::heat (
if $step >= 4 {
class { '::heat' :
notification_driver => $notification_driver,
+ rabbit_hosts => $rabbit_hosts,
}
include ::heat::config
+ include ::heat::cors
}
if $step >= 5 {
diff --git a/manifests/profile/base/heat/api.pp b/manifests/profile/base/heat/api.pp
index 68de12b..7166298 100644
--- a/manifests/profile/base/heat/api.pp
+++ b/manifests/profile/base/heat/api.pp
@@ -26,8 +26,9 @@
class tripleo::profile::base::heat::api (
$step = hiera('step'),
) {
+ include ::tripleo::profile::base::heat
+
if $step >= 4 {
- include ::tripleo::profile::base::heat
include ::heat::api
}
}
diff --git a/manifests/profile/base/heat/api_cfn.pp b/manifests/profile/base/heat/api_cfn.pp
index 7c80fc6..c1adae6 100644
--- a/manifests/profile/base/heat/api_cfn.pp
+++ b/manifests/profile/base/heat/api_cfn.pp
@@ -26,8 +26,9 @@
class tripleo::profile::base::heat::api_cfn (
$step = hiera('step'),
) {
+ include ::tripleo::profile::base::heat
+
if $step >= 4 {
- include ::tripleo::profile::base::heat
include ::heat::api_cfn
}
}
diff --git a/manifests/profile/base/heat/api_cloudwatch.pp b/manifests/profile/base/heat/api_cloudwatch.pp
index 6362275..3004db9 100644
--- a/manifests/profile/base/heat/api_cloudwatch.pp
+++ b/manifests/profile/base/heat/api_cloudwatch.pp
@@ -26,8 +26,9 @@
class tripleo::profile::base::heat::api_cloudwatch (
$step = hiera('step'),
) {
+ include ::tripleo::profile::base::heat
+
if $step >= 4 {
- include ::tripleo::profile::base::heat
include ::heat::api_cloudwatch
}
}
diff --git a/manifests/profile/base/heat/engine.pp b/manifests/profile/base/heat/engine.pp
index 32a711f..112fad8 100644
--- a/manifests/profile/base/heat/engine.pp
+++ b/manifests/profile/base/heat/engine.pp
@@ -37,12 +37,13 @@ class tripleo::profile::base::heat::engine (
$sync_db = false
}
+ include ::tripleo::profile::base::heat
+
if $step >= 3 and $sync_db {
include ::heat::db::mysql
}
if $step >= 4 or ( $step >= 3 and $sync_db ) {
- include ::tripleo::profile::base::heat
include ::heat::engine
}
diff --git a/manifests/profile/base/horizon.pp b/manifests/profile/base/horizon.pp
index 1b7df19..be07c0e 100644
--- a/manifests/profile/base/horizon.pp
+++ b/manifests/profile/base/horizon.pp
@@ -38,9 +38,9 @@ class tripleo::profile::base::horizon (
$neutron_options = {'profile_support' => $_profile_support }
$memcached_ipv6 = hiera('memcached_ipv6', false)
if $memcached_ipv6 {
- $horizon_memcached_servers = hiera('memcache_node_ips_v6', '[::1]')
+ $horizon_memcached_servers = hiera('memcached_node_ips_v6', '[::1]')
} else {
- $horizon_memcached_servers = hiera('memcache_node_ips', '127.0.0.1')
+ $horizon_memcached_servers = hiera('memcached_node_ips', '127.0.0.1')
}
class { '::horizon':
cache_server_ip => $horizon_memcached_servers,
diff --git a/manifests/profile/base/ironic.pp b/manifests/profile/base/ironic.pp
index f098d37..6c0769a 100644
--- a/manifests/profile/base/ironic.pp
+++ b/manifests/profile/base/ironic.pp
@@ -26,9 +26,14 @@
# (Optional) The current step of the deployment
# Defaults to hiera('step')
#
+# [*rabbit_hosts*]
+# list of the rabbbit host IPs
+# Defaults to hiera('rabbitmq_node_ips')
+
class tripleo::profile::base::ironic (
$bootstrap_node = hiera('bootstrap_nodeid', undef),
$step = hiera('step'),
+ $rabbit_hosts = hiera('rabbitmq_node_ips', undef),
) {
# Database is accessed by both API and conductor, hence it's here.
if $::hostname == downcase($bootstrap_node) {
@@ -43,7 +48,10 @@ class tripleo::profile::base::ironic (
if $step >= 4 or ($step >= 3 and $sync_db) {
class { '::ironic':
- sync_db => $sync_db,
+ sync_db => $sync_db,
+ rabbit_hosts => $rabbit_hosts,
}
+
+ include ::ironic::cors
}
}
diff --git a/manifests/profile/base/ironic/conductor.pp b/manifests/profile/base/ironic/conductor.pp
index 2cb61fb..4824648 100644
--- a/manifests/profile/base/ironic/conductor.pp
+++ b/manifests/profile/base/ironic/conductor.pp
@@ -22,15 +22,27 @@
# (Optional) The current step of the deployment
# Defaults to hiera('step')
#
+# [*manage_pxe*]
+# (Optional) Whether to manage the PXE/iPXE environment for the conductor.
+# Defaults to true
+#
class tripleo::profile::base::ironic::conductor (
$step = hiera('step'),
+ $manage_pxe = true,
) {
include ::tripleo::profile::base::ironic
if $step >= 4 {
- include ::ironic::drivers::deploy
- include ::ironic::drivers::ipmi
- include ::ironic::drivers::pxe
include ::ironic::conductor
+ include ::ironic::drivers::pxe
+ if $manage_pxe {
+ include ::ironic::pxe
+ }
+
+ # Configure a few popular drivers
+ include ::ironic::drivers::drac
+ include ::ironic::drivers::ilo
+ include ::ironic::drivers::ipmi
+ include ::ironic::drivers::ssh
}
}
diff --git a/manifests/profile/base/kernel.pp b/manifests/profile/base/kernel.pp
index db0280f..df13a98 100644
--- a/manifests/profile/base/kernel.pp
+++ b/manifests/profile/base/kernel.pp
@@ -19,8 +19,12 @@
#
class tripleo::profile::base::kernel {
- create_resources(kmod::load, hiera('kernel_modules'), { })
- create_resources(sysctl::value, hiera('sysctl_settings'), { })
- Exec <| tag == 'kmod::load' |> -> Sysctl <| |>
+ if hiera('kernel_modules', undef) {
+ create_resources(kmod::load, hiera('kernel_modules'), { })
+ }
+ if hiera('sysctl_settings', undef) {
+ create_resources(sysctl::value, hiera('sysctl_settings'), { })
+ }
+ Exec <| tag == 'kmod::load' |> -> Sysctl <| |>
}
diff --git a/manifests/profile/base/keystone.pp b/manifests/profile/base/keystone.pp
index d8c8e24..fd38869 100644
--- a/manifests/profile/base/keystone.pp
+++ b/manifests/profile/base/keystone.pp
@@ -31,10 +31,15 @@
# for more details.
# Defaults to hiera('step')
#
+# [*rabbit_hosts*]
+# list of the rabbbit host IPs
+# Defaults to hiera('rabbitmq_node_ips')
+
class tripleo::profile::base::keystone (
$bootstrap_node = hiera('bootstrap_nodeid', undef),
$manage_db_purge = hiera('keystone_enable_db_purge', true),
$step = hiera('step'),
+ $rabbit_hosts = hiera('rabbitmq_node_ips', undef),
) {
if $::hostname == downcase($bootstrap_node) {
$sync_db = true
@@ -54,10 +59,12 @@ class tripleo::profile::base::keystone (
class { '::keystone':
sync_db => $sync_db,
enable_bootstrap => $sync_db,
+ rabbit_hosts => $rabbit_hosts,
}
include ::keystone::config
include ::keystone::wsgi::apache
+ include ::keystone::cors
if $manage_roles {
include ::keystone::roles::admin
@@ -72,5 +79,56 @@ class tripleo::profile::base::keystone (
if $step >= 5 and $manage_db_purge {
include ::keystone::cron::token_flush
}
+
+ if $step >= 5 and $manage_endpoint{
+ if hiera('aodh_api_enabled', false) {
+ include ::aodh::keystone::auth
+ }
+ if hiera('ceilometer_api_enabled', false) {
+ include ::ceilometer::keystone::auth
+ }
+ if hiera('ceph_rgw_enabled', false) {
+ include ::ceph::rgw::keystone::auth
+ }
+ if hiera('cinder_api_enabled', false) {
+ include ::cinder::keystone::auth
+ }
+ if hiera('glance_api_enabled', false) {
+ include ::glance::keystone::auth
+ }
+ if hiera('gnocchi_api_enabled', false) {
+ include ::gnocchi::keystone::auth
+ }
+ if hiera('heat_api_enabled', false) {
+ include ::heat::keystone::auth
+ }
+ if hiera('heat_api_cfn_enabled', false) {
+ include ::heat::keystone::auth_cfn
+ }
+ if hiera('ironic_api_enabled', false) {
+ include ::ironic::keystone::auth
+ }
+ if hiera('manila_api_enabled', false) {
+ include ::manila::keystone::auth
+ }
+ if hiera('mistral_api_enabled', false) {
+ include ::mistral::keystone::auth
+ }
+ if hiera('neutron_api_enabled', false) {
+ include ::neutron::keystone::auth
+ }
+ if hiera('nova_api_enabled', false) {
+ include ::nova::keystone::auth
+ }
+ if hiera('sahara_api_enabled', false) {
+ include ::sahara::keystone::auth
+ }
+ if hiera('swift_proxy_enabled', false) {
+ include ::swift::keystone::auth
+ }
+ if hiera('trove_api_enabled', false) {
+ include ::trove::keystone::auth
+ }
+ }
}
diff --git a/manifests/profile/base/logging/fluentd.pp b/manifests/profile/base/logging/fluentd.pp
new file mode 100644
index 0000000..3ed7d88
--- /dev/null
+++ b/manifests/profile/base/logging/fluentd.pp
@@ -0,0 +1,180 @@
+# Copyright 2016 Red Hat, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+# == Class: tripleo::profile::base::logging::fluentd
+#
+# FluentD configuration for TripleO
+#
+# === Parameters
+#
+# [*step*]
+# (Optional) String. The current step of the deployment
+# Defaults to hiera('step')
+#
+# [*fluentd_sources*]
+# (Optional) List of dictionaries. A list of sources for fluentd.
+#
+# [*fluentd_filters*]
+# (Optional) List of dictionaries. A list of filters for fluentd.
+#
+# [*fluentd_servers*]
+# (Optional) List of dictionaries. A list of destination hosts for
+# fluentd. Each should be of the form {host=>'my.host.name',
+# 'port'=>24224}
+#
+# [*fluentd_groups*]
+# (Optional) List of strings. Add the 'fluentd' user to these groups.
+#
+# [*fluentd_pos_file_path*]
+# (Optional) String. Path to a directory that will be created
+# if it does not exist and made writable by the fluentd user.
+#
+# [*fluentd_use_ssl*]
+# (Optional) Boolean. If true, use the secure_forward plugin.
+#
+# [*fluentd_ssl_certificate*]
+# (Required if fluentd_use_ssl is true) PEM encoded certificate data from
+# for example "secure-forward-ca-generate".
+#
+# [*fluentd_shared_key*]
+# (Required if fluentd_use_ssl is true) Shared secret key for fluentd
+# secure-foward plugin.
+#
+# [*fluentd_listen_syslog*]
+# (Optional, default true) When true, fluentd will listen for syslog
+# messages on a local UDP port.
+#
+# [*fluentd_syslog_port*]
+# (Optional, default 42185) Port on which fluentd should listen if
+# $fluentd_listen_syslog is true.
+class tripleo::profile::base::logging::fluentd (
+ $step = hiera('step', undef),
+ $fluentd_sources = undef,
+ $fluentd_filters = undef,
+ $fluentd_servers = undef,
+ $fluentd_groups = undef,
+ $fluentd_pos_file_path = undef,
+ $fluentd_use_ssl = undef,
+ $fluentd_ssl_certificate = undef,
+ $fluentd_shared_key = undef,
+ $fluentd_listen_syslog = true,
+ $fluentd_syslog_port = 42185
+) {
+ if $step == undef or $step >= 3 {
+ include ::fluentd
+
+ if $fluentd_groups {
+ user { $::fluentd::config_owner:
+ ensure => present,
+ groups => $fluentd_groups,
+ membership => 'minimum',
+ }
+ }
+
+ if $fluentd_pos_file_path {
+ file { $fluentd_pos_file_path:
+ ensure => 'directory',
+ owner => $::fluentd::config_owner,
+ group => $::fluentd::config_group,
+ mode => '0750',
+ }
+ }
+
+ ::fluentd::plugin { 'rubygem-fluent-plugin-add':
+ plugin_provider => 'yum',
+ }
+
+ if $fluentd_sources {
+ ::fluentd::config { '100-openstack-sources.conf':
+ config => {
+ 'source' => $fluentd_sources,
+ }
+ }
+ }
+
+ if $fluentd_listen_syslog {
+ # fluentd will receive syslog messages by listening on a local udp
+ # socket.
+ ::fluentd::config { '110-system-sources.conf':
+ config => {
+ 'source' => {
+ 'type' => 'syslog',
+ 'tag' => 'system.messages',
+ 'port' => $fluentd_syslog_port,
+ }
+ }
+ }
+
+ file { '/etc/rsyslog.d/fluentd.conf':
+ content => "*.* @127.0.0.1:${fluentd_syslog_port}",
+ owner => 'root',
+ group => 'root',
+ mode => '0644',
+ } ~> exec { 'reload rsyslog':
+ command => '/bin/systemctl restart rsyslog',
+ }
+ }
+
+ if $fluentd_filters {
+ ::fluentd::config { '200-openstack-filters.conf':
+ config => {
+ 'filter' => $fluentd_filters,
+ }
+ }
+ }
+
+ if $fluentd_servers and !empty($fluentd_servers) {
+ if $fluentd_use_ssl {
+ ::fluentd::plugin { 'rubygem-fluent-plugin-secure-forward':
+ plugin_provider => 'yum',
+ }
+
+ file {'/etc/fluentd/ca_cert.pem':
+ content => $fluentd_ssl_certificate,
+ owner => $::fluentd::config_owner,
+ group => $::fluentd::config_group,
+ mode => '0444',
+ }
+
+ ::fluentd::config { '300-openstack-matches.conf':
+ config => {
+ 'match' => {
+ # lint:ignore:single_quote_string_with_variables
+ # lint:ignore:quoted_booleans
+ 'type' => 'secure_forward',
+ 'tag_pattern' => '**',
+ 'self_hostname' => '${hostname}',
+ 'secure' => 'true',
+ 'ca_cert_path' => '/etc/fluentd/ca_cert.pem',
+ 'shared_key' => $fluentd_shared_key,
+ 'server' => $fluentd_servers,
+ # lint:endignore
+ # lint:endignore
+ }
+ }
+ }
+ } else {
+ ::fluentd::config { '300-openstack-matches.conf':
+ config => {
+ 'match' => {
+ 'type' => 'forward',
+ 'tag_pattern' => '**',
+ 'server' => $fluentd_servers,
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/manifests/profile/base/manila/api.pp b/manifests/profile/base/manila/api.pp
index 9a3a314..89ff810 100644
--- a/manifests/profile/base/manila/api.pp
+++ b/manifests/profile/base/manila/api.pp
@@ -23,11 +23,18 @@
# for more details.
# Defaults to hiera('step')
#
+# [*rabbit_hosts*]
+# list of the rabbbit host IPs
+# Defaults to hiera('rabbitmq_node_ips')
+
class tripleo::profile::base::manila::api (
- $step = hiera('step'),
+ $step = hiera('step'),
+ $rabbit_hosts = hiera('rabbitmq_node_ips', undef),
) {
if $step >= 4 {
- include ::manila
+ class { '::manila' :
+ rabbit_hosts => $rabbit_hosts,
+ }
include ::manila::api
}
}
diff --git a/manifests/profile/base/mistral.pp b/manifests/profile/base/mistral.pp
index 0c41193..cffb03e 100644
--- a/manifests/profile/base/mistral.pp
+++ b/manifests/profile/base/mistral.pp
@@ -46,5 +46,6 @@ class tripleo::profile::base::mistral (
include ::mistral::config
include ::mistral::client
include ::mistral::db::sync
+ include ::mistral::cors
}
}
diff --git a/manifests/profile/base/neutron.pp b/manifests/profile/base/neutron.pp
index 7b07b1f..90a5c23 100644
--- a/manifests/profile/base/neutron.pp
+++ b/manifests/profile/base/neutron.pp
@@ -22,11 +22,18 @@
# (Optional) The current step of the deployment
# Defaults to hiera('step')
#
+# [*rabbit_hosts*]
+# list of the rabbbit host IPs
+# Defaults to hiera('rabbitmq_node_ips')
+
class tripleo::profile::base::neutron (
- $step = hiera('step'),
+ $step = hiera('step'),
+ $rabbit_hosts = hiera('rabbitmq_node_ips', undef),
) {
if $step >= 3 {
- include ::neutron
+ class { '::neutron' :
+ rabbit_hosts => $rabbit_hosts,
+ }
include ::neutron::config
}
}
diff --git a/manifests/profile/base/neutron/agents/ovn.pp b/manifests/profile/base/neutron/agents/ovn.pp
new file mode 100644
index 0000000..443b164
--- /dev/null
+++ b/manifests/profile/base/neutron/agents/ovn.pp
@@ -0,0 +1,38 @@
+# Copyright 2016 Red Hat, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+# == Class: tripleo::profile::base::neutron::agents::ovn
+#
+# OVN Neutron agent profile for tripleo
+#
+# [*ovn_db_host*]
+# The IP-Address/Hostname where OVN DBs are deployed
+#
+# [*step*]
+# (Optional) The current step in deployment. See tripleo-heat-templates
+# for more details.
+# Defaults to hiera('step')
+#
+class tripleo::profile::base::neutron::agents::ovn (
+ $ovn_db_host,
+ $step = hiera('step')
+) {
+ if $step >= 4 {
+ $ovn_sbdb_port = hiera('ovn::southbound::port')
+ class { '::ovn::controller':
+ ovn_remote => "tcp:${ovn_db_host}:${ovn_sbdb_port}",
+ ovn_encap_type => hiera('ovn::southboud::encap_type')
+ }
+ }
+}
diff --git a/manifests/profile/base/neutron/midonet.pp b/manifests/profile/base/neutron/midonet.pp
index 9104cc3..3ba9dd9 100644
--- a/manifests/profile/base/neutron/midonet.pp
+++ b/manifests/profile/base/neutron/midonet.pp
@@ -67,8 +67,8 @@ class tripleo::profile::base::neutron::midonet (
$bind_address = hiera('neutron::bind_host', ''),
$keystone_admin_token = hiera('keystone::admin_token', ''),
$neutron_api_node_ips = hiera('neutron_api_node_ips', ''),
- $neutron_auth_password = hiera('neutron::server::password', ''),
- $neutron_auth_tenant = hiera('neutron::server::project_name', ''),
+ $neutron_auth_password = hiera('neutron::keystone::authtoken::password', ''),
+ $neutron_auth_tenant = hiera('neutron::keystone::authtoken::project_name', ''),
$step = hiera('step'),
$vip = hiera('public_virtual_ip'),
$zk_on_controller = hiera('enable_zookeeper_on_controller', ''),
diff --git a/manifests/profile/base/neutron/opencontrail/vrouter.pp b/manifests/profile/base/neutron/opencontrail/vrouter.pp
new file mode 100644
index 0000000..90ab71c
--- /dev/null
+++ b/manifests/profile/base/neutron/opencontrail/vrouter.pp
@@ -0,0 +1,40 @@
+# Copyright 2016 Red Hat, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+# == Class: tripleo::profile::base::neutron::opencontrail::vrouter
+#
+# Opencontrail profile to run the contrail vrouter
+#
+# === Parameters
+#
+# [*step*]
+# (Optional) The current step of the deployment
+# Defaults to hiera('step')
+#
+class tripleo::profile::base::neutron::opencontrail::vrouter (
+ $step = hiera('step'),
+) {
+
+ if $step >= 4 {
+
+ include ::contrail::vrouter
+ # NOTE: it's not possible to use this class without a functional
+ # contrail controller up and running
+ #class {'::contrail::vrouter::provision_vrouter':
+ # require => Class['contrail::vrouter'],
+ #}
+
+ }
+
+}
diff --git a/manifests/profile/base/neutron/opendaylight.pp b/manifests/profile/base/neutron/opendaylight.pp
new file mode 100644
index 0000000..ffe28ce
--- /dev/null
+++ b/manifests/profile/base/neutron/opendaylight.pp
@@ -0,0 +1,46 @@
+# Copyright 2016 Red Hat, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+# == Class: tripleo::profile::base::neutron::opendaylight
+#
+# OpenDaylight Neutron profile for TripleO
+#
+# === Parameters
+#
+# [*step*]
+# (Optional) The current step of the deployment
+# Defaults to hiera('step')
+#
+# [*primary_controller*]
+# (Optional) The hostname of the first controller
+# Defaults to hiera('bootstrap_nodeid', undef)
+#
+class tripleo::profile::base::neutron::opendaylight (
+ $step = hiera('step'),
+ $primary_controller = hiera('bootstrap_nodeid', undef),
+) {
+
+ include ::tripleo::profile::base::neutron
+
+ if ! str2bool(hiera('opendaylight::enable_l3')) {
+ include ::tripleo::profile::base::neutron::l3
+ }
+
+ if $step >= 1 {
+ # Configure ODL only on first controller
+ if hiera('odl_on_controller') and $primary_controller == downcase($::hostname) {
+ include ::opendaylight
+ }
+ }
+}
diff --git a/manifests/profile/base/neutron/plugins/ml2.pp b/manifests/profile/base/neutron/plugins/ml2.pp
index c89bc02..4f4de0b 100644
--- a/manifests/profile/base/neutron/plugins/ml2.pp
+++ b/manifests/profile/base/neutron/plugins/ml2.pp
@@ -63,5 +63,13 @@ class tripleo::profile::base::neutron::plugins::ml2 (
if 'bsn_ml2' in $mechanism_drivers {
include ::neutron::plugins::ml2::bigswitch::restproxy
}
+
+ if 'opendaylight' in $mechanism_drivers {
+ include ::tripleo::profile::base::neutron::plugins::ml2::opendaylight
+ }
+
+ if 'ovn' in $mechanism_drivers {
+ include ::tripleo::profile::base::neutron::plugins::ml2::ovn
+ }
}
}
diff --git a/manifests/profile/base/neutron/plugins/ml2/opendaylight.pp b/manifests/profile/base/neutron/plugins/ml2/opendaylight.pp
new file mode 100644
index 0000000..f25aea6
--- /dev/null
+++ b/manifests/profile/base/neutron/plugins/ml2/opendaylight.pp
@@ -0,0 +1,54 @@
+# Copyright 2016 Red Hat, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+# == Class: tripleo::profile::base::neutron::plugins::ml2::opendaylight
+#
+# OpenDaylight ML2 Neutron profile for TripleO
+#
+# === Parameters
+#
+# [*odl_port*]
+# (Optional) Port to use for OpenDaylight
+# Defaults to hiera('opendaylight::odl_rest_port')
+#
+# [*conn_proto*]
+# (Optional) Protocol to use to for ODL REST access
+# Defaults to hiera('opendaylight::nb_connection_protocol')
+#
+# [*step*]
+# (Optional) The current step in deployment. See tripleo-heat-templates
+# for more details.
+# Defaults to hiera('step')
+#
+class tripleo::profile::base::neutron::plugins::ml2::opendaylight (
+ $odl_port = hiera('opendaylight::odl_rest_port'),
+ $conn_proto = hiera('opendaylight::nb_connection_protocol'),
+ $step = hiera('step'),
+) {
+
+ if $step >= 4 {
+ # Figure out ODL IP
+ if hiera('odl_on_controller') {
+ $odl_url_ip = hiera('opendaylight_api_vip')
+ } else {
+ $odl_url_ip = hiera('opendaylight::odl_bind_ip')
+ }
+
+ if ! $odl_url_ip { fail('OpenDaylight Controller IP/VIP is Empty') }
+
+ class { '::neutron::plugins::ml2::opendaylight':
+ odl_url => "${conn_proto}://${odl_url_ip}:${odl_port}/controller/nb/v2/neutron";
+ }
+ }
+}
diff --git a/manifests/profile/base/neutron/plugins/ml2/ovn.pp b/manifests/profile/base/neutron/plugins/ml2/ovn.pp
new file mode 100644
index 0000000..46477a7
--- /dev/null
+++ b/manifests/profile/base/neutron/plugins/ml2/ovn.pp
@@ -0,0 +1,46 @@
+# Copyright 2016 Red Hat, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+# == Class: tripleo::profile::base::neutron::plugins::ml2::ovn
+#
+# OVN Neutron ML2 profile for tripleo
+#
+# [*ovn_db_host*]
+# The IP-Address/Hostname where OVN DBs are deployed
+#
+# [*step*]
+# (Optional) The current step in deployment. See tripleo-heat-templates
+# for more details.
+# Defaults to hiera('step')
+#
+class tripleo::profile::base::neutron::plugins::ml2::ovn (
+ $ovn_db_host,
+ $step = hiera('step')
+) {
+ if $step >= 4 {
+ if $::hostname == $ovn_db_host {
+ # NOTE: we might split northd from plugin later, in the case of
+ # micro-services, where neutron-server & northd are not in the same
+ # containers
+ include ::ovn::northd
+ }
+ $ovn_nb_port = hiera('ovn::northbound::port')
+ $ovn_sb_port = hiera('ovn::southbound::port')
+ class { '::neutron::plugins::ml2::ovn':
+ ovn_nb_connection => "tcp:${ovn_db_host}:${ovn_nb_port}",
+ ovn_sb_connection => "tcp:${ovn_db_host}:${ovn_sb_port}",
+ }
+ }
+}
+
diff --git a/manifests/profile/base/neutron/plugins/ovs/opendaylight.pp b/manifests/profile/base/neutron/plugins/ovs/opendaylight.pp
new file mode 100644
index 0000000..7548046
--- /dev/null
+++ b/manifests/profile/base/neutron/plugins/ovs/opendaylight.pp
@@ -0,0 +1,73 @@
+# Copyright 2016 Red Hat, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+# == Class: tripleo::profile::base::neutron::plugins::ovs::opendaylight
+#
+# OpenDaylight Neutron OVS profile for TripleO
+#
+# === Parameters
+#
+# [*odl_port*]
+# (Optional) Port to use for OpenDaylight
+# Defaults to hiera('opendaylight::odl_rest_port')
+#
+# [*odl_check_url*]
+# (Optional) URL path used to check if ODL is up
+# Defaults to hiera('opendaylight_check_url')
+#
+# [*odl_api_ips*]
+# (Optional) List of OpenStack Controller IPs for ODL API
+# Defaults to hiera('opendaylight_api_node_ips')
+#
+# [*conn_proto*]
+# (Optional) Protocol to use to for ODL REST access
+# Defaults to hiera('opendaylight::nb_connection_protocol')
+#
+# [*step*]
+# (Optional) The current step in deployment. See tripleo-heat-templates
+# for more details.
+# Defaults to hiera('step')
+#
+class tripleo::profile::base::neutron::plugins::ovs::opendaylight (
+ $odl_port = hiera('opendaylight::odl_rest_port'),
+ $odl_check_url = hiera('opendaylight_check_url'),
+ $odl_api_ips = hiera('opendaylight_api_node_ips'),
+ $conn_proto = hiera('opendaylight::nb_connection_protocol'),
+ $step = hiera('step'),
+) {
+
+ if $step >= 4 {
+ # Figure out ODL IP (and VIP if on controller)
+ if hiera('odl_on_controller') {
+ $opendaylight_controller_ip = $odl_api_ips[0]
+ $odl_url_ip = hiera('opendaylight_api_vip')
+ } else {
+ $opendaylight_controller_ip = hiera('opendaylight::odl_bind_ip')
+ $odl_url_ip = $opendaylight_controller_ip
+ }
+
+ if ! $opendaylight_controller_ip { fail('OpenDaylight Controller IP is Empty') }
+
+ if ! $odl_url_ip { fail('OpenDaylight API VIP is Empty') }
+
+ # Build URL to check if ODL is up before connecting OVS
+ $opendaylight_url = "${conn_proto}://${odl_url_ip}:${odl_port}/${odl_check_url}"
+
+ class { '::neutron::plugins::ovs::opendaylight':
+ tunnel_ip => hiera('neutron::agents::ml2::ovs::local_ip'),
+ odl_check_url => $opendaylight_url,
+ odl_ovsdb_iface => "tcp:${opendaylight_controller_ip}:6640",
+ }
+ }
+}
diff --git a/manifests/profile/base/neutron/plumgrid.pp b/manifests/profile/base/neutron/plumgrid.pp
new file mode 100644
index 0000000..03dc101
--- /dev/null
+++ b/manifests/profile/base/neutron/plumgrid.pp
@@ -0,0 +1,45 @@
+# Copyright 2016 Red Hat, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+# == Class: tripleo::profile::base::neutron::plumgrid
+#
+# Plumgrid Neutron helper profile (extra settings for compute, etc. roles)
+#
+# === Parameters
+# [*step*]
+# (Optional) The current step of the deployment
+# Defaults to hiera('step')
+#
+class tripleo::profile::base::neutron::plumgrid (
+ $step = hiera('step'),
+) {
+
+ if $step >= 4 {
+
+ # forward all ipv4 traffic
+ # this is required for the vms to pass through the gateways public interface
+ sysctl::value { 'net.ipv4.ip_forward': value => '1' }
+
+ # ifc_ctl_pp needs to be invoked by root as part of the vif.py when a VM is powered on
+ file { '/etc/sudoers.d/ifc_ctl_sudoers':
+ ensure => file,
+ owner => root,
+ group => root,
+ mode => '0440',
+ content => "nova ALL=(root) NOPASSWD: /opt/pg/bin/ifc_ctl_pp *\n",
+ }
+
+ }
+
+}
diff --git a/manifests/profile/base/neutron/sriov.pp b/manifests/profile/base/neutron/sriov.pp
new file mode 100644
index 0000000..00ecc21
--- /dev/null
+++ b/manifests/profile/base/neutron/sriov.pp
@@ -0,0 +1,43 @@
+# Copyright 2016 Red Hat, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+# == Class: tripleo::profile::base::neutron::sriov
+#
+# Neutron SR-IOV nic Agent profile for tripleo
+#
+# === Parameters
+#
+# [*step*]
+# (Optional) The current step in deployment. See tripleo-heat-templates
+# for more details.
+# Defaults to hiera('step')
+#
+# [*mechanism_drivers*]
+# (Optional) The mechanism drivers to use with the Ml2 plugin
+# Defaults to hiera('neutron::plugins::ml2::mechanism_drivers')
+#
+
+class tripleo::profile::base::neutron::sriov(
+ $step = hiera('step'),
+ $mechanism_drivers = hiera('neutron::plugins::ml2::mechanism_drivers'),
+) {
+
+ if $step >= 4 {
+ if 'sriovnicswitch' in $mechanism_drivers {
+ include ::neutron::agents::ml2::sriov
+ include ::tripleo::host::sriov
+ }
+ }
+
+}
diff --git a/manifests/profile/base/nova.pp b/manifests/profile/base/nova.pp
index 07c3be1..74f0460 100644
--- a/manifests/profile/base/nova.pp
+++ b/manifests/profile/base/nova.pp
@@ -38,12 +38,17 @@
# (Optional) The current step of the deployment
# Defaults to hiera('step')
#
+# [*rabbit_hosts*]
+# list of the rabbbit host IPs
+# Defaults to hiera('rabbitmq_node_ips')
+
class tripleo::profile::base::nova (
$bootstrap_node = hiera('bootstrap_nodeid', undef),
$libvirt_enabled = false,
$manage_migration = false,
$nova_compute_enabled = false,
$step = hiera('step'),
+ $rabbit_hosts = hiera('rabbitmq_node_ips', undef),
) {
if $::hostname == downcase($bootstrap_node) {
$sync_db = true
@@ -52,13 +57,15 @@ class tripleo::profile::base::nova (
}
if hiera('nova::use_ipv6', false) {
- $memcache_servers = suffix(hiera('memcache_node_ips_v6'), ':11211')
+ $memcache_servers = suffix(hiera('memcached_node_ips_v6'), ':11211')
} else {
- $memcache_servers = suffix(hiera('memcache_node_ips'), ':11211')
+ $memcache_servers = suffix(hiera('memcached_node_ips'), ':11211')
}
if hiera('step') >= 4 or (hiera('step') >= 3 and $sync_db) {
- include ::nova
+ class { '::nova' :
+ rabbit_hosts => $rabbit_hosts,
+ }
include ::nova::config
class { '::nova::cache':
enabled => true,
diff --git a/manifests/profile/base/pacemaker.pp b/manifests/profile/base/pacemaker.pp
index 2c70eab..0d628b5 100644
--- a/manifests/profile/base/pacemaker.pp
+++ b/manifests/profile/base/pacemaker.pp
@@ -75,6 +75,10 @@ class tripleo::profile::base::pacemaker (
Pacemaker::Resource::Service {
op_params => 'start timeout=200s stop timeout=200s',
}
+
+ file { '/var/lib/tripleo/pacemaker-restarts':
+ ensure => directory,
+ } ~> Tripleo::Pacemaker::Resource_restart_flag<||>
}
if $step >= 2 {
diff --git a/manifests/profile/base/rabbitmq.pp b/manifests/profile/base/rabbitmq.pp
index dc6ea4d..2fd2347 100644
--- a/manifests/profile/base/rabbitmq.pp
+++ b/manifests/profile/base/rabbitmq.pp
@@ -36,7 +36,7 @@
#
# [*nodes*]
# (Optional) Array of host(s) for RabbitMQ nodes.
-# Defaults to hiera('rabbit_node_ips', []).
+# Defaults to hiera('rabbitmq_node_ips', []).
#
# [*step*]
# (Optional) The current step in deployment. See tripleo-heat-templates
@@ -48,7 +48,7 @@ class tripleo::profile::base::rabbitmq (
$environment = hiera('rabbitmq_environment'),
$ipv6 = str2bool(hiera('rabbit_ipv6', false)),
$kernel_variables = hiera('rabbitmq_kernel_variables'),
- $nodes = hiera('rabbit_node_ips', []),
+ $nodes = hiera('rabbitmq_node_ips', []),
$step = hiera('step'),
) {
# IPv6 environment, necessary for RabbitMQ.
diff --git a/manifests/profile/base/sahara.pp b/manifests/profile/base/sahara.pp
index 96d23a6..cf0ee90 100644
--- a/manifests/profile/base/sahara.pp
+++ b/manifests/profile/base/sahara.pp
@@ -26,9 +26,14 @@
# (Optional) The current step of the deployment
# Defaults to hiera('step')
#
+# [*rabbit_hosts*]
+# list of the rabbbit host IPs
+# Defaults to hiera('rabbitmq_node_ips')
+
class tripleo::profile::base::sahara (
$bootstrap_node = hiera('bootstrap_nodeid', undef),
$step = hiera('step'),
+ $rabbit_hosts = hiera('rabbitmq_node_ips', undef),
) {
if $::hostname == downcase($bootstrap_node) {
$sync_db = true
@@ -38,7 +43,8 @@ class tripleo::profile::base::sahara (
if $step >= 4 or ($step >= 3 and $sync_db){
class { '::sahara':
- sync_db => $sync_db,
+ sync_db => $sync_db,
+ rabbit_hosts => $rabbit_hosts,
}
}
}
diff --git a/manifests/profile/base/snmp.pp b/manifests/profile/base/snmp.pp
index 2ed6752..301ac9a 100644
--- a/manifests/profile/base/snmp.pp
+++ b/manifests/profile/base/snmp.pp
@@ -43,7 +43,16 @@ class tripleo::profile::base::snmp (
}
class { '::snmp':
agentaddress => ['udp:161','udp6:[::1]:161'],
- snmpd_config => [ join(['createUser ', $snmpd_user, ' MD5 "', $snmpd_password, '"']), join(['rouser ', $snmpd_user]), 'proc cron', 'includeAllDisks 10%', 'master agentx', 'trapsink localhost public', 'iquerySecName internalUser', 'rouser internalUser', 'defaultMonitors yes', 'linkUpDownNotifications yes' ],
+ snmpd_config => [ join(['createUser ', $snmpd_user, ' MD5 "', $snmpd_password, '"']),
+ join(['rouser ', $snmpd_user]),
+ 'proc cron',
+ 'includeAllDisks 10%',
+ 'master agentx',
+ 'trapsink localhost public',
+ 'iquerySecName internalUser',
+ 'rouser internalUser',
+ 'defaultMonitors yes',
+ 'linkUpDownNotifications yes' ],
}
}
}
diff --git a/manifests/profile/base/swift/proxy.pp b/manifests/profile/base/swift/proxy.pp
index 1e763a1..a95d05f 100644
--- a/manifests/profile/base/swift/proxy.pp
+++ b/manifests/profile/base/swift/proxy.pp
@@ -23,14 +23,27 @@
# for more details.
# Defaults to hiera('step')
#
+# [*memcache_servers*]
+# (Optional) List of memcache servers
+# Defaults to hiera('memcached_node_ips')
+#
+# [*memcache_port*]
+# (Optional) memcache port
+# Defaults to 11211
+#
class tripleo::profile::base::swift::proxy (
$step = hiera('step'),
+ $memcache_servers = hiera('memcached_node_ips'),
+ $memcache_port = 11211,
) {
if $step >= 4 {
+ $swift_memcache_servers = suffix($memcache_servers, ":${memcache_port}")
include ::swift::proxy
include ::swift::proxy::proxy_logging
include ::swift::proxy::healthcheck
- include ::swift::proxy::cache
+ class { '::swift::proxy::cache':
+ memcache_servers => $swift_memcache_servers
+ }
include ::swift::proxy::keystone
include ::swift::proxy::authtoken
include ::swift::proxy::staticweb
diff --git a/manifests/profile/base/swift/ringbuilder.pp b/manifests/profile/base/swift/ringbuilder.pp
index e0f67cd..98a09a0 100644
--- a/manifests/profile/base/swift/ringbuilder.pp
+++ b/manifests/profile/base/swift/ringbuilder.pp
@@ -26,7 +26,8 @@
# Defaults to true
#
# [*devices*]
-# (Optional) The swift devices
+# (Optional) DEPRECATED The swift devices
+# Should pass raw_disk_prefix, raw_disks and swift_storage_node_ips instead
# Defaults to ''
#
# [*step*]
@@ -38,12 +39,30 @@
# (Optional) The swift zones
# Defaults to 1
#
+# [*raw_disk_prefix*]
+# (Optional) Disk prefix used to create devices list
+# Defaults to 'r1z1-'
+#
+# [*raw_disks*]
+# (Optional) list of raw disks in format
+# [':%PORT%/device1', ':%PORT%/device2']
+# Combined with raw_disk_prefix and swift_storage_node_ips
+# to create devices list
+# Defaults to an empty list
+#
+# [*swift_storage_node_ips*]
+# (Optional) list of ip addresses for nodes running swift_storage service
+# Defaults to hiera('swift_storage_node_ips') or an empty list
+#
class tripleo::profile::base::swift::ringbuilder (
$replicas,
$build_ring = true,
- $devices = '',
+ $devices = undef,
$step = hiera('step'),
$swift_zones = '1',
+ $raw_disk_prefix = 'r1z1-',
+ $raw_disks = [],
+ $swift_storage_node_ips = hiera('swift_storage_node_ips', []),
) {
if $step >= 2 {
# pre-install swift here so we can build rings
@@ -54,8 +73,11 @@ class tripleo::profile::base::swift::ringbuilder (
validate_bool($build_ring)
if $build_ring {
-
- $device_array = strip(split(rstrip($devices), ','))
+ if $devices {
+ $device_array = strip(split(rstrip($devices), ','))
+ } else {
+ $device_array = tripleo_swift_devices($raw_disk_prefix, $swift_storage_node_ips, $raw_disks)
+ }
# create local rings
swift::ringbuilder::create{ ['object', 'account', 'container']:
diff --git a/manifests/profile/base/swift/storage.pp b/manifests/profile/base/swift/storage.pp
index 5e266a9..0b09ea6 100644
--- a/manifests/profile/base/swift/storage.pp
+++ b/manifests/profile/base/swift/storage.pp
@@ -34,6 +34,7 @@ class tripleo::profile::base::swift::storage (
) {
if $step >= 4 {
if $enable_swift_storage {
+ include ::swift::storage::disks
include ::swift::storage::all
if(!defined(File['/srv/node'])) {
file { '/srv/node':
diff --git a/manifests/profile/base/ui.pp b/manifests/profile/base/ui.pp
new file mode 100644
index 0000000..22371d1
--- /dev/null
+++ b/manifests/profile/base/ui.pp
@@ -0,0 +1,24 @@
+# Copyright 2016 Red Hat, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+# == Class: tripleo::profile::base::ui
+#
+# UI profile for tripleo
+#
+class tripleo::profile::base::ui () {
+ package {'openstack-tripleo-ui': }
+
+ include ::apache
+}
+
diff --git a/manifests/profile/pacemaker/ceilometer.pp b/manifests/profile/pacemaker/ceilometer.pp
index 531b4bc..a31128d 100644
--- a/manifests/profile/pacemaker/ceilometer.pp
+++ b/manifests/profile/pacemaker/ceilometer.pp
@@ -87,22 +87,6 @@ class tripleo::profile::pacemaker::ceilometer (
require => [Pacemaker::Resource::Service[$::ceilometer::params::agent_central_service_name],
Pacemaker::Resource::Service[$::ceilometer::params::collector_service_name]],
}
- pacemaker::constraint::base { 'ceilometer-collector-then-ceilometer-api-constraint':
- constraint_type => 'order',
- first_resource => "${::ceilometer::params::collector_service_name}-clone",
- second_resource => "${::ceilometer::params::api_service_name}-clone",
- first_action => 'start',
- second_action => 'start',
- require => [Pacemaker::Resource::Service[$::ceilometer::params::collector_service_name],
- Pacemaker::Resource::Service[$::ceilometer::params::api_service_name]],
- }
- pacemaker::constraint::colocation { 'ceilometer-api-with-ceilometer-collector-colocation':
- source => "${::ceilometer::params::api_service_name}-clone",
- target => "${::ceilometer::params::collector_service_name}-clone",
- score => 'INFINITY',
- require => [Pacemaker::Resource::Service[$::ceilometer::params::api_service_name],
- Pacemaker::Resource::Service[$::ceilometer::params::collector_service_name]],
- }
}
}
diff --git a/manifests/profile/pacemaker/ceilometer/api.pp b/manifests/profile/pacemaker/ceilometer/api.pp
index 0eddaec..169121b 100644
--- a/manifests/profile/pacemaker/ceilometer/api.pp
+++ b/manifests/profile/pacemaker/ceilometer/api.pp
@@ -34,10 +34,11 @@ class tripleo::profile::pacemaker::ceilometer::api (
include ::ceilometer::params
include ::tripleo::profile::pacemaker::ceilometer
include ::tripleo::profile::base::ceilometer::api
+ include ::tripleo::profile::pacemaker::apache
if $step >= 5 and downcase($::hostname) == $pacemaker_master {
- pacemaker::resource::service { $::ceilometer::params::api_service_name :
- clone_params => 'interleave=true',
+ class { '::tripleo::profile::base::ceilometer::api':
+ step => $step,
}
}
diff --git a/manifests/profile/pacemaker/cinder/backup.pp b/manifests/profile/pacemaker/cinder/backup.pp
new file mode 100644
index 0000000..72ec456
--- /dev/null
+++ b/manifests/profile/pacemaker/cinder/backup.pp
@@ -0,0 +1,60 @@
+# Copyright 2016 Red Hat, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+# == Class: tripleo::profile::pacemaker::cinder::backup
+#
+# Cinder Backup Pacemaker HA profile for tripleo
+#
+# === Parameters
+#
+# [*bootstrap_node*]
+# (Optional) The hostname of the node responsible for bootstrapping tasks
+# Defaults to hiera('bootstrap_nodeid')
+#
+# [*step*]
+# (Optional) The current step in deployment. See tripleo-heat-templates
+# for more details.
+# Defaults to hiera('step')
+#
+class tripleo::profile::pacemaker::cinder::backup (
+ $bootstrap_node = hiera('bootstrap_nodeid'),
+ $step = hiera('step'),
+) {
+
+ Service <| tag == 'cinder::backup' |> {
+ hasrestart => true,
+ restart => '/bin/true',
+ start => '/bin/true',
+ stop => '/bin/true',
+ }
+
+ if $::hostname == downcase($bootstrap_node) {
+ $pacemaker_master = true
+ } else {
+ $pacemaker_master = false
+ }
+
+ include ::tripleo::profile::base::cinder::backup
+
+ if $step >= 3 and $pacemaker_master and hiera('stack_action') == 'UPDATE' {
+ Cinder_config<||>
+ ~>
+ tripleo::pacemaker::resource_restart_flag { "${::cinder::params::backup_service}": }
+ }
+
+ if $step >= 5 and $pacemaker_master {
+ pacemaker::resource::service { $::cinder::params::backup_service : }
+ }
+
+}
diff --git a/manifests/profile/pacemaker/cinder/volume.pp b/manifests/profile/pacemaker/cinder/volume.pp
index 5a581eb..82e2522 100644
--- a/manifests/profile/pacemaker/cinder/volume.pp
+++ b/manifests/profile/pacemaker/cinder/volume.pp
@@ -46,6 +46,12 @@ class tripleo::profile::pacemaker::cinder::volume (
include ::tripleo::profile::base::cinder::volume
+ if $step >= 3 and $pacemaker_master and hiera('stack_action') == 'UPDATE' {
+ Cinder_api_paste_ini<||> ~> Tripleo::Pacemaker::Resource_restart_flag["${::cinder::params::volume_service}"]
+ Cinder_config<||> ~> Tripleo::Pacemaker::Resource_restart_flag["${::cinder::params::volume_service}"]
+ tripleo::pacemaker::resource_restart_flag { "${::cinder::params::volume_service}": }
+ }
+
if $step >= 5 and $pacemaker_master {
pacemaker::resource::service { $::cinder::params::volume_service : }
}
diff --git a/manifests/profile/pacemaker/database/mysql.pp b/manifests/profile/pacemaker/database/mysql.pp
index 529aeac..4dc3770 100644
--- a/manifests/profile/pacemaker/database/mysql.pp
+++ b/manifests/profile/pacemaker/database/mysql.pp
@@ -32,8 +32,17 @@ class tripleo::profile::pacemaker::database::mysql (
$pacemaker_master = false
}
$mysql_bind_host = hiera('mysql_bind_host')
- $galera_nodes = downcase(hiera('galera_node_names', $::hostname))
+
+ # use only mysql_node_names when we land a patch in t-h-t that
+ # switches to autogenerating these values from composable services
+ $galera_node_names_lookup = hiera('mysql_node_names', hiera('galera_node_names', $::hostname))
+ if is_array($galera_node_names_lookup) {
+ $galera_nodes = downcase(join($galera_node_names_lookup, ','))
+ } else {
+ $galera_nodes = downcase($galera_node_names_lookup)
+ }
$galera_nodes_count = count(split($galera_nodes, ','))
+
$mysqld_options = {
'mysqld' => {
'skip-name-resolve' => '1',
@@ -71,7 +80,13 @@ class tripleo::profile::pacemaker::database::mysql (
mysql_server_options => $mysqld_options,
}
- if $step >= 2 and $pacemaker_master {
+ if $step >= 1 and $pacemaker_master and hiera('stack_action') == 'UPDATE' {
+ tripleo::pacemaker::resource_restart_flag { 'galera-master':
+ subscribe => File['mysql-config-file'],
+ }
+ }
+
+ if $step >= 2 {
if $pacemaker_master {
pacemaker::resource::ocf { 'galera' :
ocf_agent_name => 'heartbeat:galera',
@@ -150,8 +165,12 @@ MYSQL_HOST=localhost\n",
# with proper credentials. This step happens on every node because this sql
# statement does not automatically replicate across nodes.
$mysql_root_password = hiera('mysql::server::root_password')
+ $galera_set_pwd = "/bin/touch /root/.my.cnf && \
+ /bin/echo \"UPDATE mysql.user SET Password = PASSWORD('${mysql_root_password}') WHERE user = 'root'; \
+ flush privileges;\" | \
+ /bin/mysql --defaults-extra-file=/root/.my.cnf -u root"
exec { 'galera-set-root-password':
- command => "/bin/touch /root/.my.cnf && /bin/echo \"UPDATE mysql.user SET Password = PASSWORD('${mysql_root_password}') WHERE user = 'root'; flush privileges;\" | /bin/mysql --defaults-extra-file=/root/.my.cnf -u root",
+ command => $galera_set_pwd,
}
file { '/root/.my.cnf' :
ensure => file,
diff --git a/manifests/profile/pacemaker/database/redis.pp b/manifests/profile/pacemaker/database/redis.pp
index 8a37ce9..e081516 100644
--- a/manifests/profile/pacemaker/database/redis.pp
+++ b/manifests/profile/pacemaker/database/redis.pp
@@ -44,6 +44,14 @@ class tripleo::profile::pacemaker::database::redis (
if $step >= 1 {
include ::redis
+
+ if $pacemaker_master and hiera('stack_action') == 'UPDATE' {
+ tripleo::pacemaker::resource_restart_flag { 'redis-master':
+ # ouch, but trying to stay close how notification works in
+ # puppet-redis when pacemaker is not being used
+ subscribe => Exec["cp -p ${::redis::config_file_orig} ${::redis::config_file}"]
+ }
+ }
}
if $step >= 2 and $pacemaker_master {
diff --git a/manifests/profile/pacemaker/haproxy.pp b/manifests/profile/pacemaker/haproxy.pp
index 1b83d9b..b2e127b 100644
--- a/manifests/profile/pacemaker/haproxy.pp
+++ b/manifests/profile/pacemaker/haproxy.pp
@@ -44,6 +44,12 @@ class tripleo::profile::pacemaker::haproxy (
$pacemaker_master = false
}
+ if $step >= 1 and $pacemaker_master and hiera('stack_action') == 'UPDATE' {
+ tripleo::pacemaker::resource_restart_flag { 'haproxy-clone':
+ subscribe => Concat['/etc/haproxy/haproxy.cfg'],
+ }
+ }
+
if $step >= 2 and $pacemaker_master and $enable_load_balancer {
# FIXME: we should not have to access tripleo::haproxy class
# parameters here to configure pacemaker VIPs. The configuration
diff --git a/manifests/profile/pacemaker/manila.pp b/manifests/profile/pacemaker/manila.pp
index 43ae875..a7f91fc 100644
--- a/manifests/profile/pacemaker/manila.pp
+++ b/manifests/profile/pacemaker/manila.pp
@@ -83,6 +83,34 @@
# (Optional)
# Defaults to hiera('manila::backend::generic::volume_snapshot_name_template')
#
+# [*manila_cephfsnative_enable*]
+# (Optional) Enable the CephFS Native backend.
+# Defaults to hiera('manila_cephfsnative_enable_backend', 'false')
+#
+# [*cephfs_handles_share_servers*]
+# (Optional)
+# Defaults to hiera('manila::backend::cephfsnative::driver_handles_share_servers', false)
+#
+# [*cephfs_backend_name*]
+# (Optional)
+# Defaults to hiera('manila::backend::cephfsnative::cephfs_backend_name')
+#
+# [*cephfs_conf_path*]
+# (Optional)
+# Defaults to hiera('manila::backend::cephfsnative::cephfs_conf_path')
+#
+# [*cephfs_auth_id*]
+# (Optional)
+# Defaults to hiera('manila::backend::cephfsnative::cephfs_auth_id')
+#
+# [*cephfs_cluster_name*]
+# (Optional)
+# Defaults to hiera('manila::backend::cephfsnative::cephfs_cluster_name')
+#
+# [*cephfs_enable_snapshots*]
+# (Optional)
+# Defaults to hiera('manila::backend::cephfsnative::cephfs_enable_snapshots')
+#
class tripleo::profile::pacemaker::manila (
$bootstrap_node = hiera('bootstrap_nodeid'),
$cinder_volume_type = hiera('manila::backend::generic::cinder_volume_type', ''),
@@ -100,6 +128,13 @@ class tripleo::profile::pacemaker::manila (
$step = hiera('step'),
$volume_name_template = hiera('manila::backend::generic::volume_name_template'),
$volume_snapshot_name_template = hiera('manila::backend::generic::volume_snapshot_name_template'),
+ $manila_cephfsnative_enable = hiera('manila::backend::cephfsnative::enable_backend', false),
+ $cephfs_handles_share_servers = hiera('manila::backend::cephfsnative::driver_handles_share_servers'),
+ $cephfs_backend_name = hiera('manila::backend::cephfsnative::cephfs_backend_name'),
+ $cephfs_conf_path = hiera('manila::backend::cephfsnative::cephfs_conf_path'),
+ $cephfs_auth_id = hiera('manila::backend::cephfsnative::cephfs_auth_id'),
+ $cephfs_cluster_name = hiera('manila::backend::cephfsnative::cephfs_cluster_name'),
+ $cephfs_enable_snapshots = hiera('manila::backend::cephfsnative::cephfs_enable_snapshots'),
) {
if $::hostname == downcase($bootstrap_node) {
$pacemaker_master = true
@@ -145,10 +180,34 @@ class tripleo::profile::pacemaker::manila (
include ::manila::volume::cinder
}
- $manila_enabled_backends = delete_undef_values([$manila_generic_backend])
+ # manila cephfsnative:
+ if $manila_cephfsnative_enable {
+ $manila_cephfsnative_backend = hiera('manila::backend::cephfsnative::title')
+ manila::backend::cephfsnative { $manila_cephfsnative_backend :
+ driver_handles_share_servers => $cephfs_handles_share_servers,
+ cephfs_backend_name => $cephfs_backend_name,
+ cephfs_conf_path => $cephfs_conf_path,
+ cephfs_auth_id => $cephfs_auth_id,
+ cephfs_cluster_name => $cephfs_cluster_name,
+ cephfs_enable_snapshots => $cephfs_enable_snapshots,
+ }
+ }
+
+ $manila_enabled_backends = delete_undef_values(
+ [
+ $manila_generic_backend,
+ $manila_cephfsnative_backend
+ ]
+ )
class { '::manila::backends' :
enabled_share_backends => $manila_enabled_backends,
}
+
+ if $pacemaker_master and hiera('stack_action') == 'UPDATE' {
+ Manila_api_paste_ini<||> ~> Tripleo::Pacemaker::Resource_restart_flag["${::manila::params::share_service}"]
+ Manila_config<||> ~> Tripleo::Pacemaker::Resource_restart_flag["${::manila::params::share_service}"]
+ tripleo::pacemaker::resource_restart_flag { "${::manila::params::share_service}": }
+ }
}
if $step >= 5 and $pacemaker_master {
diff --git a/manifests/profile/pacemaker/rabbitmq.pp b/manifests/profile/pacemaker/rabbitmq.pp
index 93edec9..1f25e8b 100644
--- a/manifests/profile/pacemaker/rabbitmq.pp
+++ b/manifests/profile/pacemaker/rabbitmq.pp
@@ -54,6 +54,12 @@ class tripleo::profile::pacemaker::rabbitmq (
require => Class['::rabbitmq'],
}
+ if $step >= 1 and $pacemaker_master and hiera('stack_action') == 'UPDATE' {
+ tripleo::pacemaker::resource_restart_flag { 'rabbitmq-clone':
+ subscribe => Class['rabbitmq::service'],
+ }
+ }
+
if $step >= 2 and $pacemaker_master {
pacemaker::resource::ocf { 'rabbitmq':
ocf_agent_name => 'heartbeat:rabbitmq-cluster',
diff --git a/manifests/trusted_ca.pp b/manifests/trusted_ca.pp
new file mode 100644
index 0000000..4e62418
--- /dev/null
+++ b/manifests/trusted_ca.pp
@@ -0,0 +1,39 @@
+# Copyright 2016 Red Hat, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+# == Class: tripleo::trusted_ca
+#
+# Does the necessary action to deploy and trust a CA certificate.
+#
+# === Parameters
+#
+# [*content*]
+# The content of the CA certificate in PEM format.
+#
+define tripleo::trusted_ca(
+ $content,
+) {
+ file { "/etc/pki/ca-trust/source/anchors/${name}.pem":
+ content => $content,
+ mode => '0644',
+ owner => 'root',
+ group => 'root',
+ }
+ exec { "trust-ca-${name}":
+ command => 'update-ca-trust extract',
+ path => '/usr/bin',
+ subscribe => File["/etc/pki/ca-trust/source/anchors/${name}.pem"],
+ refreshonly => true,
+ }
+}
diff --git a/manifests/trusted_cas.pp b/manifests/trusted_cas.pp
new file mode 100644
index 0000000..265a700
--- /dev/null
+++ b/manifests/trusted_cas.pp
@@ -0,0 +1,28 @@
+# Copyright 2016 Red Hat, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+# == Class: tripleo::trusted_cas
+#
+# Does the necessary actions to deploy and trust a set of CA certificates.
+#
+# === Parameters
+#
+# [*ca_map*]
+# The content of the CA certificate in PEM format.
+#
+class tripleo::trusted_cas(
+ $ca_map = {},
+) {
+ create_resources('::tripleo::trusted_ca', $ca_map)
+}
diff --git a/manifests/vip_hosts.pp b/manifests/vip_hosts.pp
new file mode 100644
index 0000000..7b260fd
--- /dev/null
+++ b/manifests/vip_hosts.pp
@@ -0,0 +1,39 @@
+# Copyright 2016 Red Hat, Inc.
+# All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+# == Class: tripleo::vip_hosts
+#
+# Write the overcloud VIPs into /etc/hosts
+#
+# === Parameters
+#
+# [*hosts_spec*]
+# The specification of the hosts that will be added to the /etc/hosts file.
+# These come in the form of a hash that will be consumed by create_resources.
+# e.g.:
+# tripleo::hosts_spec:
+# host-1:
+# name: host1.domain
+# ip: 127.0.0.1
+# host-2:
+# name: host2.domain
+# ip: 127.0.0.2
+#
+class tripleo::vip_hosts (
+ $hosts_spec
+) {
+ create_resources('host', $hosts_spec)
+}
+
diff --git a/metadata.json b/metadata.json
index 8d38b3f..7ad9745 100644
--- a/metadata.json
+++ b/metadata.json
@@ -1,6 +1,6 @@
{
"name": "openstack-tripleo",
- "version": "1.0.0",
+ "version": "5.0.0",
"author": "OpenStack Contributors",
"summary": "Puppet module for TripleO",
"license": "Apache-2.0",
diff --git a/releasenotes/notes/sriov_numvfs-40564db9e1be589b.yaml b/releasenotes/notes/sriov_numvfs-40564db9e1be589b.yaml
new file mode 100644
index 0000000..85cbdec
--- /dev/null
+++ b/releasenotes/notes/sriov_numvfs-40564db9e1be589b.yaml
@@ -0,0 +1,4 @@
+---
+features:
+ - Added a provider to configure VFs for SR-IOV interface.
+ Added a define for persistence of the VFs configuratin.
diff --git a/spec/classes/tripleo_host_sriov_spec.rb b/spec/classes/tripleo_host_sriov_spec.rb
new file mode 100644
index 0000000..15d3813
--- /dev/null
+++ b/spec/classes/tripleo_host_sriov_spec.rb
@@ -0,0 +1,39 @@
+require 'spec_helper'
+
+describe 'tripleo::host::sriov' do
+
+ shared_examples_for 'sriov vfs configuration for Red Hat distributions' do
+
+ let :facts do
+ {
+ :osfamily => 'RedHat',
+ :operatingsystemmajrelease => 7,
+ }
+ end
+
+ let :params do
+ {:number_of_vfs => []}
+ end
+
+ it 'does not configure numvfs by default' do
+ is_expected.not_to contain_sriov_vf_config([])
+ end
+
+ context 'when number_of_vfs is configured' do
+ let :params do
+ {:number_of_vfs => ['eth0:4','eth1:5']}
+ end
+
+ it 'configures numvfs' do
+ is_expected.to contain_sriov_vf_config('eth0:4').with( :ensure => 'present' )
+ is_expected.to contain_sriov_vf_config('eth1:5').with( :ensure => 'present')
+ is_expected.to contain_tripleo__host__sriov__numvfs_persistence('persistent_numvfs').with(
+ :vf_defs => ['eth0:4','eth1:5'],
+ :content_string => "#!/bin/bash\n"
+ )
+ end
+ end
+ end
+
+ it_configures 'sriov vfs configuration for Red Hat distributions'
+end
diff --git a/spec/defines/tripleo_host_sriov_numvfs_persistence_spec.rb b/spec/defines/tripleo_host_sriov_numvfs_persistence_spec.rb
new file mode 100644
index 0000000..57559a2
--- /dev/null
+++ b/spec/defines/tripleo_host_sriov_numvfs_persistence_spec.rb
@@ -0,0 +1,40 @@
+require 'spec_helper'
+
+describe 'tripleo::host::sriov::numvfs_persistence' do
+
+ describe 'confugure numvfs for persistence' do
+
+ let :title do
+ 'numvfs'
+ end
+
+ let :params do
+ {
+ :name => 'persistence',
+ :vf_defs => ['eth0:10','eth1:8'],
+ :content_string => "Hashbang\n"
+ }
+ end
+
+ it 'configures persistence' do
+ is_expected.to contain_file('/etc/sysconfig/allocate_vfs').with(
+ :ensure => 'file',
+ :content => "Hashbang\n[ \"eth0\" == \"\$1\" ] && echo 10 > /sys/class/net/eth0/device/sriov_numvfs\n[ \"eth1\" == \"\$1\" ] && echo 8 > /sys/class/net/eth1/device/sriov_numvfs\n",
+ :group => 'root',
+ :mode => '0755',
+ :owner => 'root',
+ )
+ is_expected.to contain_file('/sbin/ifup-local').with(
+ :group => 'root',
+ :mode => '0755',
+ :owner => 'root',
+ :content => '#!/bin/bash',
+ :replace => false,
+ )
+ is_expected.to contain_file_line('call_ifup-local').with(
+ :path => '/sbin/ifup-local',
+ :line => '/etc/sysconfig/allocate_vfs $1',
+ )
+ end
+ end
+end
diff --git a/spec/unit/provider/sriov_vf_config/numvfs_spec.rb b/spec/unit/provider/sriov_vf_config/numvfs_spec.rb
new file mode 100644
index 0000000..ac1a398
--- /dev/null
+++ b/spec/unit/provider/sriov_vf_config/numvfs_spec.rb
@@ -0,0 +1,40 @@
+require 'puppet'
+require 'spec_helper'
+require 'puppet/provider/sriov_vf_config/numvfs'
+
+provider_class = Puppet::Type.type(:sriov_vf_config).
+ provider(:numvfs)
+
+describe provider_class do
+
+ let(:test_cfg_path) { "/tmp/test-ifup-local.txt" }
+ let :numvfs_conf do
+ {
+ :name => 'eth0:10',
+ :ensure => 'present',
+ }
+ end
+
+ describe 'when setting the attributes' do
+ let :resource do
+ Puppet::Type::Sriov_vf_config.new(numvfs_conf)
+ end
+
+ let :provider do
+ provider_class.new(resource)
+ end
+
+ it 'should return the correct interface name' do
+ expect(provider.sriov_get_interface).to eql('eth0')
+ end
+
+ it 'should return the correct numvfs value' do
+ expect(provider.sriov_numvfs_value).to eql(10)
+ end
+
+ it 'should return path of the file to enable vfs' do
+ expect(provider.sriov_numvfs_path).to eql('/sys/class/net/eth0/device/sriov_numvfs')
+ end
+ end
+
+end
diff --git a/spec/unit/type/sriov_vf_config_spec.rb b/spec/unit/type/sriov_vf_config_spec.rb
new file mode 100644
index 0000000..9a911f6
--- /dev/null
+++ b/spec/unit/type/sriov_vf_config_spec.rb
@@ -0,0 +1,47 @@
+require 'puppet'
+require 'puppet/type/sriov_vf_config'
+
+describe 'Puppet::Type.type(:sriov_vf_config)' do
+ it 'should allow name to be passed' do
+ expect{Puppet::Type.type(:sriov_vf_config).new(
+ :name => 'eth0:10',
+ :ensure => 'present'
+ )}.not_to raise_error
+ end
+ it 'should allow name to be passed with -' do
+ expect{Puppet::Type.type(:sriov_vf_config).new(
+ :name => 'eth-0:10',
+ :ensure => 'present'
+ )}.not_to raise_error
+ end
+ it 'should allow name to be passed with _' do
+ expect{Puppet::Type.type(:sriov_vf_config).new(
+ :name => 'eth_0:10',
+ :ensure => 'present'
+ )}.not_to raise_error
+ end
+ it 'should throw error for invalid format' do
+ expect{Puppet::Type.type(:sriov_vf_config).new(
+ :name => 'eth0',
+ :ensure => 'present'
+ )}.to raise_error(Puppet::ResourceError)
+ end
+ it 'should throw error for invalid format without interface name' do
+ expect{Puppet::Type.type(:sriov_vf_config).new(
+ :name => ':9',
+ :ensure => 'present'
+ )}.to raise_error(Puppet::ResourceError)
+ end
+ it 'should throw error for invalid format for numvfs' do
+ expect{Puppet::Type.type(:sriov_vf_config).new(
+ :name => 'eth8:none',
+ :ensure => 'present'
+ )}.to raise_error(Puppet::ResourceError)
+ end
+ it 'should throw error for invalid format without numvfs' do
+ expect{Puppet::Type.type(:sriov_vf_config).new(
+ :name => 'eth0:',
+ :ensure => 'present'
+ )}.to raise_error(Puppet::ResourceError)
+ end
+end