diff --git a/REFERENCE.md b/REFERENCE.md
index a3e383eaa..4bab04992 100644
--- a/REFERENCE.md
+++ b/REFERENCE.md
@@ -24,6 +24,7 @@
* [`prometheus::grok_exporter`](#prometheus--grok_exporter): This module manages prometheus grok_exporter
* [`prometheus::haproxy_exporter`](#prometheus--haproxy_exporter): This module manages prometheus haproxy_exporter
* [`prometheus::install`](#prometheus--install): Install prometheus
+* [`prometheus::iperf3_exporter`](#prometheus--iperf3_exporter): This module manages prometheus node iperf3_exporter
* [`prometheus::ipmi_exporter`](#prometheus--ipmi_exporter): This module manages prometheus node ipmi_exporter (https://github.com/soundcloud/ipmi_exporter)
* [`prometheus::ipsec_exporter`](#prometheus--ipsec_exporter): This module manages prometheus node ipsec_exporter
* [`prometheus::jmx_exporter`](#prometheus--jmx_exporter): Installs and configures the Prometheus JMX exporter
@@ -4949,6 +4950,267 @@ implement the package install method as well
The package method needs specific yum or apt repo settings which are not made yet by the module
+### `prometheus::iperf3_exporter`
+
+This module manages prometheus node iperf3_exporter
+
+#### Parameters
+
+The following parameters are available in the `prometheus::iperf3_exporter` class:
+
+* [`arch`](#-prometheus--iperf3_exporter--arch)
+* [`bin_dir`](#-prometheus--iperf3_exporter--bin_dir)
+* [`download_extension`](#-prometheus--iperf3_exporter--download_extension)
+* [`download_url`](#-prometheus--iperf3_exporter--download_url)
+* [`download_url_base`](#-prometheus--iperf3_exporter--download_url_base)
+* [`options`](#-prometheus--iperf3_exporter--options)
+* [`extra_groups`](#-prometheus--iperf3_exporter--extra_groups)
+* [`group`](#-prometheus--iperf3_exporter--group)
+* [`init_style`](#-prometheus--iperf3_exporter--init_style)
+* [`install_method`](#-prometheus--iperf3_exporter--install_method)
+* [`manage_group`](#-prometheus--iperf3_exporter--manage_group)
+* [`manage_service`](#-prometheus--iperf3_exporter--manage_service)
+* [`manage_user`](#-prometheus--iperf3_exporter--manage_user)
+* [`os`](#-prometheus--iperf3_exporter--os)
+* [`package_ensure`](#-prometheus--iperf3_exporter--package_ensure)
+* [`package_name`](#-prometheus--iperf3_exporter--package_name)
+* [`purge_config_dir`](#-prometheus--iperf3_exporter--purge_config_dir)
+* [`restart_on_change`](#-prometheus--iperf3_exporter--restart_on_change)
+* [`service_enable`](#-prometheus--iperf3_exporter--service_enable)
+* [`service_ensure`](#-prometheus--iperf3_exporter--service_ensure)
+* [`service_name`](#-prometheus--iperf3_exporter--service_name)
+* [`user`](#-prometheus--iperf3_exporter--user)
+* [`version`](#-prometheus--iperf3_exporter--version)
+* [`export_scrape_job`](#-prometheus--iperf3_exporter--export_scrape_job)
+* [`scrape_host`](#-prometheus--iperf3_exporter--scrape_host)
+* [`scrape_port`](#-prometheus--iperf3_exporter--scrape_port)
+* [`scrape_job_name`](#-prometheus--iperf3_exporter--scrape_job_name)
+* [`scrape_job_labels`](#-prometheus--iperf3_exporter--scrape_job_labels)
+
+##### `arch`
+
+Data type: `String[1]`
+
+Architecture (amd64 or i386)
+
+Default value: `$prometheus::real_arch`
+
+##### `bin_dir`
+
+Data type: `Stdlib::AbsolutePath`
+
+Directory where binaries are located
+
+Default value: `$prometheus::bin_dir`
+
+##### `download_extension`
+
+Data type: `String[1]`
+
+Extension for the release binary archive
+
+Default value: `'tar.gz'`
+
+##### `download_url`
+
+Data type: `Optional[Prometheus::Uri]`
+
+Complete URL corresponding to the where the release binary archive can be downloaded
+
+Default value: `undef`
+
+##### `download_url_base`
+
+Data type: `Prometheus::Uri`
+
+Base URL for the binary archive
+
+Default value: `'https://github.com/edgard/iperf3_exporter/releases'`
+
+##### `options`
+
+Data type: `Optional[String[1]]`
+
+Options added to the startup command
+
+Default value: `undef`
+
+##### `extra_groups`
+
+Data type: `Array[String[1]]`
+
+Extra groups to add the binary user to
+
+Default value: `[]`
+
+##### `group`
+
+Data type: `String[1]`
+
+Group under which the binary is running
+
+Default value: `'iperf3-exporter'`
+
+##### `init_style`
+
+Data type: `Prometheus::Initstyle`
+
+Service startup scripts style (e.g. rc, upstart or systemd)
+
+Default value: `$facts['service_provider']`
+
+##### `install_method`
+
+Data type: `Prometheus::Install`
+
+Installation method: url or package (only url is supported currently)
+
+Default value: `$prometheus::install_method`
+
+##### `manage_group`
+
+Data type: `Boolean`
+
+Whether to create a group for or rely on external code for that
+
+Default value: `true`
+
+##### `manage_service`
+
+Data type: `Boolean`
+
+Should puppet manage the service? (default true)
+
+Default value: `true`
+
+##### `manage_user`
+
+Data type: `Boolean`
+
+Whether to create user or rely on external code for that
+
+Default value: `true`
+
+##### `os`
+
+Data type: `String[1]`
+
+Operating system (linux is the only one supported)
+
+Default value: `downcase($facts['kernel'])`
+
+##### `package_ensure`
+
+Data type: `String[1]`
+
+If package, then use this for package ensure default 'latest'
+
+Default value: `'latest'`
+
+##### `package_name`
+
+Data type: `String[1]`
+
+The binary package name - not available yet
+
+Default value: `'iperf3_exporter'`
+
+##### `purge_config_dir`
+
+Data type: `Boolean`
+
+Purge config files no longer generated by Puppet
+
+Default value: `true`
+
+##### `restart_on_change`
+
+Data type: `Boolean`
+
+Should puppet restart the service on configuration change? (default true)
+
+Default value: `true`
+
+##### `service_enable`
+
+Data type: `Boolean`
+
+Whether to enable the service from puppet (default true)
+
+Default value: `true`
+
+##### `service_ensure`
+
+Data type: `Stdlib::Ensure::Service`
+
+State ensured for the service (default 'running')
+
+Default value: `'running'`
+
+##### `service_name`
+
+Data type: `String[1]`
+
+Name of the iperf3 exporter service (default 'iperf3_exporter')
+
+Default value: `'iperf3_exporter'`
+
+##### `user`
+
+Data type: `String[1]`
+
+User which runs the service
+
+Default value: `'iperf3-exporter'`
+
+##### `version`
+
+Data type: `String[1]`
+
+The binary release version
+
+Default value: `'0.1.3'`
+
+##### `export_scrape_job`
+
+Data type: `Boolean`
+
+
+
+Default value: `false`
+
+##### `scrape_host`
+
+Data type: `Optional[Stdlib::Host]`
+
+
+
+Default value: `undef`
+
+##### `scrape_port`
+
+Data type: `Stdlib::Port`
+
+
+
+Default value: `9579`
+
+##### `scrape_job_name`
+
+Data type: `String[1]`
+
+
+
+Default value: `'iperf3'`
+
+##### `scrape_job_labels`
+
+Data type: `Optional[Hash]`
+
+
+
+Default value: `undef`
+
### `prometheus::ipmi_exporter`
This module manages prometheus node ipmi_exporter (https://github.com/soundcloud/ipmi_exporter)
diff --git a/manifests/iperf3_exporter.pp b/manifests/iperf3_exporter.pp
new file mode 100644
index 000000000..82b76f11f
--- /dev/null
+++ b/manifests/iperf3_exporter.pp
@@ -0,0 +1,114 @@
+# @summary This module manages prometheus node iperf3_exporter
+# @param arch
+# Architecture (amd64 or i386)
+# @param bin_dir
+# Directory where binaries are located
+# @param download_extension
+# Extension for the release binary archive
+# @param download_url
+# Complete URL corresponding to the where the release binary archive can be downloaded
+# @param download_url_base
+# Base URL for the binary archive
+# @param options
+# Options added to the startup command
+# @param extra_groups
+# Extra groups to add the binary user to
+# @param group
+# Group under which the binary is running
+# @param init_style
+# Service startup scripts style (e.g. rc, upstart or systemd)
+# @param install_method
+# Installation method: url or package (only url is supported currently)
+# @param manage_group
+# Whether to create a group for or rely on external code for that
+# @param manage_service
+# Should puppet manage the service? (default true)
+# @param manage_user
+# Whether to create user or rely on external code for that
+# @param os
+# Operating system (linux is the only one supported)
+# @param package_ensure
+# If package, then use this for package ensure default 'latest'
+# @param package_name
+# The binary package name - not available yet
+# @param purge_config_dir
+# Purge config files no longer generated by Puppet
+# @param restart_on_change
+# Should puppet restart the service on configuration change? (default true)
+# @param service_enable
+# Whether to enable the service from puppet (default true)
+# @param service_ensure
+# State ensured for the service (default 'running')
+# @param service_name
+# Name of the iperf3 exporter service (default 'iperf3_exporter')
+# @param user
+# User which runs the service
+# @param version
+# The binary release version
+class prometheus::iperf3_exporter (
+ String[1] $download_extension = 'tar.gz',
+ Prometheus::Uri $download_url_base = 'https://github.com/edgard/iperf3_exporter/releases',
+ Array[String[1]] $extra_groups = [],
+ String[1] $group = 'iperf3-exporter',
+ String[1] $package_ensure = 'latest',
+ String[1] $package_name = 'iperf3_exporter',
+ String[1] $service_name = 'iperf3_exporter',
+ String[1] $user = 'iperf3-exporter',
+ # renovate: depName=edgard/iperf3_exporter
+ String[1] $version = '0.1.3',
+ String[1] $os = downcase($facts['kernel']),
+ Optional[String[1]] $options = undef,
+ Prometheus::Initstyle $init_style = $facts['service_provider'],
+ Prometheus::Install $install_method = $prometheus::install_method,
+ Optional[Prometheus::Uri] $download_url = undef,
+ String[1] $arch = $prometheus::real_arch,
+ Stdlib::AbsolutePath $bin_dir = $prometheus::bin_dir,
+ Boolean $export_scrape_job = false,
+ Optional[Stdlib::Host] $scrape_host = undef,
+ Stdlib::Port $scrape_port = 9579,
+ String[1] $scrape_job_name = 'iperf3',
+ Optional[Hash] $scrape_job_labels = undef,
+ Boolean $service_enable = true,
+ Boolean $manage_service = true,
+ Stdlib::Ensure::Service $service_ensure = 'running',
+ Boolean $restart_on_change = true,
+ Boolean $purge_config_dir = true,
+ Boolean $manage_user = true,
+ Boolean $manage_group = true,
+) inherits prometheus {
+ $real_download_url = pick($download_url,"${download_url_base}/download/v${version}/${package_name}-${version}.${os}-${arch}.${download_extension}")
+
+ $notify_service = $restart_on_change ? {
+ true => Service[$service_name],
+ default => undef,
+ }
+
+ prometheus::daemon { 'iperf3_exporter':
+ install_method => $install_method,
+ version => $version,
+ download_extension => $download_extension,
+ os => $os,
+ arch => $arch,
+ real_download_url => $real_download_url,
+ bin_dir => $bin_dir,
+ notify_service => $notify_service,
+ package_name => $package_name,
+ package_ensure => $package_ensure,
+ manage_user => $manage_user,
+ user => $user,
+ extra_groups => $extra_groups,
+ group => $group,
+ manage_group => $manage_group,
+ purge => $purge_config_dir,
+ options => $options,
+ init_style => $init_style,
+ service_ensure => $service_ensure,
+ service_enable => $service_enable,
+ manage_service => $manage_service,
+ export_scrape_job => $export_scrape_job,
+ scrape_host => $scrape_host,
+ scrape_port => $scrape_port,
+ scrape_job_name => $scrape_job_name,
+ scrape_job_labels => $scrape_job_labels,
+ }
+}
diff --git a/spec/acceptance/iperf3_exporter_spec.rb b/spec/acceptance/iperf3_exporter_spec.rb
new file mode 100644
index 000000000..a28273b45
--- /dev/null
+++ b/spec/acceptance/iperf3_exporter_spec.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+require 'spec_helper_acceptance'
+
+describe 'prometheus iperf3_exporter' do
+ it 'iperf3_exporter works idempotently with no errors' do
+ pp = 'include prometheus::iperf3_exporter'
+ # Run it twice and test for idempotency
+ apply_manifest(pp, catch_failures: true)
+ apply_manifest(pp, catch_changes: true)
+ end
+
+ describe service('iperf3_exporter') do
+ it { is_expected.to be_running }
+ it { is_expected.to be_enabled }
+ end
+
+ describe port(9579) do
+ it { is_expected.to be_listening.with('tcp6') }
+ end
+
+ # rubocop:disable RSpec/RepeatedExampleGroupBody,RSpec/RepeatedExampleGroupDescription
+ describe 'iperf3_exporter update from 0.1.2 to 0.1.3' do
+ it 'is idempotent' do
+ pp = "class{'prometheus::iperf3_exporter': version => '0.1.2'}"
+ # Run it twice and test for idempotency
+ apply_manifest(pp, catch_failures: true)
+ apply_manifest(pp, catch_changes: true)
+ end
+
+ describe service('iperf3_exporter') do
+ it { is_expected.to be_running }
+ it { is_expected.to be_enabled }
+ end
+
+ describe port(9579) do
+ it { is_expected.to be_listening.with('tcp6') }
+ end
+
+ it 'is idempotent' do
+ pp = "class{'prometheus::iperf3_exporter': version => '0.1.3'}"
+ # Run it twice and test for idempotency
+ apply_manifest(pp, catch_failures: true)
+ apply_manifest(pp, catch_changes: true)
+ end
+
+ describe service('iperf3_exporter') do
+ it { is_expected.to be_running }
+ it { is_expected.to be_enabled }
+ end
+
+ describe port(9579) do
+ it { is_expected.to be_listening.with('tcp6') }
+ end
+ end
+ # rubocop:enable RSpec/RepeatedExampleGroupBody,RSpec/RepeatedExampleGroupDescription
+end
diff --git a/spec/classes/iperf3_exporter_spec.rb b/spec/classes/iperf3_exporter_spec.rb
new file mode 100644
index 000000000..e5a4ee821
--- /dev/null
+++ b/spec/classes/iperf3_exporter_spec.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'prometheus::iperf3_exporter' do
+ on_supported_os.each do |os, facts|
+ context "on #{os}" do
+ let(:facts) do
+ facts.merge(os_specific_facts(facts))
+ end
+
+ context 'without parameters' do
+ it { is_expected.to contain_prometheus__daemon('iperf3_exporter') }
+ it { is_expected.to compile.with_all_deps }
+ it { is_expected.to contain_group('iperf3-exporter') }
+ it { is_expected.to contain_service('iperf3_exporter') }
+ it { is_expected.to contain_user('iperf3-exporter') }
+ it { is_expected.to contain_class('prometheus') }
+ end
+
+ context 'with params' do
+ let :params do
+ {
+ install_method: 'url',
+ version: '0.1.3'
+ }
+ end
+
+ it { is_expected.to contain_archive('/tmp/iperf3_exporter-0.1.3.tar.gz') }
+ it { is_expected.to contain_file('/opt/iperf3_exporter-0.1.3.linux-amd64/iperf3_exporter') }
+ end
+ end
+ end
+end