2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: "Publish module"

on:
workflow_dispatch:

jobs:
release:
uses: "puppetlabs/cat-github-actions/.github/workflows/module_release.yml@main"
Expand Down
7 changes: 7 additions & 0 deletions .rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ require:
- rubocop-performance
- rubocop-rspec
AllCops:
NewCops: enable
DisplayCopNames: true
TargetRubyVersion: '2.6'
Include:
Expand Down Expand Up @@ -529,6 +530,8 @@ Lint/DuplicateBranch:
Enabled: false
Lint/DuplicateMagicComment:
Enabled: false
Lint/DuplicateMatchPattern:
Enabled: false
Lint/DuplicateRegexpCharacterClassElement:
Enabled: false
Lint/EmptyBlock:
Expand Down Expand Up @@ -645,6 +648,8 @@ Style/ComparableClamp:
Enabled: false
Style/ConcatArrayLiterals:
Enabled: false
Style/DataInheritance:
Enabled: false
Style/DirEmpty:
Enabled: false
Style/DocumentDynamicEvalDefinition:
Expand Down Expand Up @@ -713,6 +718,8 @@ Style/RedundantHeredocDelimiterQuotes:
Enabled: false
Style/RedundantInitialize:
Enabled: false
Style/RedundantLineContinuation:
Enabled: false
Style/RedundantSelfAssignmentBranch:
Enabled: false
Style/RedundantStringEscape:
Expand Down
4 changes: 2 additions & 2 deletions .sync.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ Gemfile:
optional:
":development":
- gem: beaker
version: '~> 5.0'
version: '~> 6.0'
from_env: BEAKER_VERSION
- gem: beaker-abs
from_env: BEAKER_ABS_VERSION
Expand All @@ -19,7 +19,7 @@ Gemfile:
# Prevent beaker-puppet from being installed on Ruby > 3.1 until beaker-puppet supports newer Rubies (PA-6136)
- gem: beaker-puppet
from_env: BEAKER_PUPPET_VERSION
version: '~> 3.0'
version: '~> 4.0'
condition: Gem::Requirement.create('< 3.2.0').satisfied_by?(Gem::Version.new(RUBY_VERSION.dup))
# We can unpin async when we move to Ruby 3
- gem: async
Expand Down
2 changes: 1 addition & 1 deletion .vscode/extensions.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"recommendations": [
"puppet.puppet-vscode",
"rebornix.Ruby"
"Shopify.ruby-lsp"
]
}
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org).

## [v1.6.0](https://github.com/puppetlabs/puppetlabs-zfs_core/tree/v1.6.0) - 2024-07-15

[Full Changelog](https://github.com/puppetlabs/puppetlabs-zfs_core/compare/v1.5.0...v1.6.0)

### Added

- Update zfs with relatime support [#84](https://github.com/puppetlabs/puppetlabs-zfs_core/pull/84) ([AriaXLi](https://github.com/AriaXLi))
- (PA-5790) Add zfs attribute defaultuserquota [#83](https://github.com/puppetlabs/puppetlabs-zfs_core/pull/83) ([AriaXLi](https://github.com/AriaXLi))
- Add support for nvme devices [#66](https://github.com/puppetlabs/puppetlabs-zfs_core/pull/66) ([murkyway](https://github.com/murkyway))

## [v1.5.0](https://github.com/puppetlabs/puppetlabs-zfs_core/tree/v1.5.0) - 2024-03-06

[Full Changelog](https://github.com/puppetlabs/puppetlabs-zfs_core/compare/v1.4.0...v1.5.0)
Expand Down
31 changes: 15 additions & 16 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -20,40 +20,39 @@ group :development do
gem "json", '= 2.6.1', require: false if Gem::Requirement.create(['>= 3.1.0', '< 3.1.3']).satisfied_by?(Gem::Version.new(RUBY_VERSION.dup))
gem "json", '= 2.6.3', require: false if Gem::Requirement.create(['>= 3.2.0', '< 4.0.0']).satisfied_by?(Gem::Version.new(RUBY_VERSION.dup))
gem "racc", '~> 1.4.0', require: false if Gem::Requirement.create(['>= 2.7.0', '< 3.0.0']).satisfied_by?(Gem::Version.new(RUBY_VERSION.dup))
gem "deep_merge", '~> 1.0', require: false
gem "voxpupuli-puppet-lint-plugins", '~> 5.0', require: false
gem "facterdb", '~> 1.18', require: false
gem "metadata-json-lint", '~> 3.0', require: false
gem "puppetlabs_spec_helper", '~> 6.0', require: false
gem "rspec-puppet-facts", '~> 2.0', require: false
gem "codecov", '~> 0.2', require: false
gem "metadata-json-lint", '~> 4.0', require: false
gem "rspec-puppet-facts", '~> 3.0', require: false
gem "dependency_checker", '~> 1.0.0', require: false
gem "parallel_tests", '= 3.12.1', require: false
gem "pry", '~> 0.10', require: false
gem "simplecov-console", '~> 0.5', require: false
gem "simplecov-console", '~> 0.9', require: false
gem "puppet-debugger", '~> 1.0', require: false
gem "rubocop", '= 1.48.1', require: false
gem "rubocop", '~> 1.50.0', require: false
gem "rubocop-performance", '= 1.16.0', require: false
gem "rubocop-rspec", '= 2.19.0', require: false
gem "puppet-strings", '~> 4.0', require: false
gem "rb-readline", '= 0.5.5', require: false, platforms: [:mswin, :mingw, :x64_mingw]
gem "beaker", *location_for(ENV['BEAKER_VERSION'] || '~> 5.0')
gem "beaker", *location_for(ENV['BEAKER_VERSION'] || '~> 6.0')
gem "beaker-abs", *location_for(ENV['BEAKER_ABS_VERSION'] || '~> 1.0')
gem "beaker-hostgenerator"
gem "beaker-rspec"
gem "beaker-puppet", *location_for(ENV['BEAKER_PUPPET_VERSION'] || '~> 3.0') if Gem::Requirement.create('< 3.2.0').satisfied_by?(Gem::Version.new(RUBY_VERSION.dup))
gem "beaker-puppet", *location_for(ENV['BEAKER_PUPPET_VERSION'] || '~> 4.0') if Gem::Requirement.create('< 3.2.0').satisfied_by?(Gem::Version.new(RUBY_VERSION.dup))
gem "async", '~> 1', require: false
gem "beaker-module_install_helper", require: false
gem "beaker-puppet_install_helper", require: false
gem "nokogiri", require: false
end
group :system_tests do
gem "puppet_litmus", '~> 1.0', require: false, platforms: [:ruby, :x64_mingw]
gem "serverspec", '~> 2.41', require: false
gem "voxpupuli-acceptance", require: false
end
group :release_prep do
group :development, :release_prep do
gem "puppet-strings", '~> 4.0', require: false
gem "puppetlabs_spec_helper", '~> 6.0', require: false
gem "puppetlabs_spec_helper", '~> 7.0', require: false
end
group :system_tests do
gem "puppet_litmus", '~> 1.0', require: false, platforms: [:ruby, :x64_mingw]
gem "CFPropertyList", '< 3.0.7', require: false, platforms: [:mswin, :mingw, :x64_mingw]
gem "serverspec", '~> 2.41', require: false
gem "voxpupuli-acceptance", require: false
end

puppet_version = ENV['PUPPET_GEM_VERSION']
Expand Down
8 changes: 8 additions & 0 deletions REFERENCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,10 @@ The copies property. Valid values are `1`, `2`, `3`.

The dedup property. Valid values are `on`, `off`.

##### `defaultuserquota`

The defaultuserquota property. Valid values are `<size>`, `none`.

##### `devices`

The devices property. Valid values are `on`, `off`.
Expand Down Expand Up @@ -123,6 +127,10 @@ The refquota property. Valid values are `<size>`, `none`.

The refreservation property. Valid values are `<size>`, `none`.

##### `relatime`

The relatime property. Valid values are `on`, `off`. Only supported on Linux

##### `reservation`

The reservation property. Valid values are `<size>`, `none`.
Expand Down
79 changes: 0 additions & 79 deletions Rakefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,86 +4,7 @@ require 'bundler'
require 'puppet_litmus/rake_tasks' if Gem.loaded_specs.key? 'puppet_litmus'
require 'puppetlabs_spec_helper/rake_tasks'
require 'puppet-syntax/tasks/puppet-syntax'
require 'github_changelog_generator/task' if Gem.loaded_specs.key? 'github_changelog_generator'
require 'puppet-strings/tasks' if Gem.loaded_specs.key? 'puppet-strings'
require 'voxpupuli/acceptance/rake' if Gem.loaded_specs.key? 'voxpupuli-acceptance'

def changelog_user
return unless Rake.application.top_level_tasks.include? "changelog"
returnVal = nil || JSON.load(File.read('metadata.json'))['author']
raise "unable to find the changelog_user in .sync.yml, or the author in metadata.json" if returnVal.nil?
puts "GitHubChangelogGenerator user:#{returnVal}"
returnVal
end

def changelog_project
return unless Rake.application.top_level_tasks.include? "changelog"

returnVal = nil
returnVal ||= begin
metadata_source = JSON.load(File.read('metadata.json'))['source']
metadata_source_match = metadata_source && metadata_source.match(%r{.*\/([^\/]*?)(?:\.git)?\Z})

metadata_source_match && metadata_source_match[1]
end

raise "unable to find the changelog_project in .sync.yml or calculate it from the source in metadata.json" if returnVal.nil?

puts "GitHubChangelogGenerator project:#{returnVal}"
returnVal
end

def changelog_future_release
return unless Rake.application.top_level_tasks.include? "changelog"
returnVal = "v%s" % JSON.load(File.read('metadata.json'))['version']
raise "unable to find the future_release (version) in metadata.json" if returnVal.nil?
puts "GitHubChangelogGenerator future_release:#{returnVal}"
returnVal
end

PuppetLint.configuration.send('disable_relative')


if Gem.loaded_specs.key? 'github_changelog_generator'
GitHubChangelogGenerator::RakeTask.new :changelog do |config|
raise "Set CHANGELOG_GITHUB_TOKEN environment variable eg 'export CHANGELOG_GITHUB_TOKEN=valid_token_here'" if Rake.application.top_level_tasks.include? "changelog" and ENV['CHANGELOG_GITHUB_TOKEN'].nil?
config.user = "#{changelog_user}"
config.project = "#{changelog_project}"
config.future_release = "#{changelog_future_release}"
config.exclude_labels = ['maintenance']
config.header = "# Change log\n\nAll notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org)."
config.add_pr_wo_labels = true
config.issues = false
config.merge_prefix = "### UNCATEGORIZED PRS; LABEL THEM ON GITHUB"
config.configure_sections = {
"Changed" => {
"prefix" => "### Changed",
"labels" => ["backwards-incompatible"],
},
"Added" => {
"prefix" => "### Added",
"labels" => ["enhancement", "feature"],
},
"Fixed" => {
"prefix" => "### Fixed",
"labels" => ["bug", "documentation", "bugfix"],
},
}
end
else
desc 'Generate a Changelog from GitHub'
task :changelog do
raise <<EOM
The changelog tasks depends on recent features of the github_changelog_generator gem.
Please manually add it to your .sync.yml for now, and run `pdk update`:
---
Gemfile:
optional:
':development':
- gem: 'github_changelog_generator'
version: '~> 1.15'
condition: "Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new('2.3.0')"
EOM
end
end

4 changes: 3 additions & 1 deletion lib/puppet/provider/zfs/zfs.rb
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,9 @@ def container_property
# aclmode was removed from S11 in build 139 but it may have been added back
# acltype is for ZFS on Linux, and allows disabling or enabling POSIX ACLs
# http://webcache.googleusercontent.com/search?q=cache:-p74K0DVsdwJ:developers.slashdot.org/story/11/11/09/2343258/solaris-11-released+&cd=13
[:aclmode, :acltype, :shareiscsi, :overlay].each do |field|
# defaultuserquota is not supported in zfs filesystem versions older than 6 and will error on Solaris 10 machines
# relatime is only supported on ZFS on Linux
[:aclmode, :acltype, :shareiscsi, :overlay, :defaultuserquota, :relatime].each do |field|
# The zfs commands use the property value '-' to indicate that the
# property is not set. We make use of this value to indicate that the
# property is not set since it is not available. Conversely, if these
Expand Down
2 changes: 1 addition & 1 deletion lib/puppet/provider/zpool/zpool.rb
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ def process_zpool_data(pool_array)
pool[:raid_parity] = 'raidz2' if %r{^raidz2}.match?(value)
else
# get full drive name if the value is a partition (Linux only)
tmp << if Facter.value(:kernel) == 'Linux' && value =~ %r{/dev/(:?[a-z]+1|disk/by-id/.+-part1)$}
tmp << if Facter.value(:kernel) == 'Linux' && value =~ %r{/dev/(:?[a-z]+([0-9]+n[0-9]+p)?1|disk/by-id/.+-part1)$}
execute("lsblk -p -no pkname #{value}").chomp
else
value
Expand Down
18 changes: 18 additions & 0 deletions lib/puppet/type/zfs.rb
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,16 @@ module Puppet
desc 'The dedup property. Valid values are `on`, `off`.'
end

newproperty(:defaultuserquota) do
desc 'The defaultuserquota property. Valid values are `<size>`, `none`.'

# Solaris 10 uses zfs filesystem version 5 which doesn't support defaultuserquota
validate do |_value|
raise Puppet::Error _('This property is only supported on zfs filestystem version >= 6') if Facter.value(:kernel) == 'SunOS' && Puppet::Util::Package.versioncmp(Facter.value(:kernelrelease),
'11') < 0
end
end

newproperty(:devices) do
desc 'The devices property. Valid values are `on`, `off`.'
end
Expand Down Expand Up @@ -108,6 +118,14 @@ module Puppet
desc 'The refreservation property. Valid values are `<size>`, `none`.'
end

newproperty(:relatime) do
desc 'The relatime property. Valid values are `on`, `off`. Only supported on Linux'

validate do |_value|
raise Puppet::Error _('This property is only supported on Linux') unless Facter.value(:kernel) == 'Linux'
end
end

newproperty(:reservation) do
desc 'The reservation property. Valid values are `<size>`, `none`.'
end
Expand Down
8 changes: 4 additions & 4 deletions metadata.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "puppetlabs-zfs_core",
"version": "1.5.0",
"version": "1.6.0",
"author": "puppetlabs",
"summary": "Manage zfs. Create destroy and set properties on zfs instances.",
"license": "Apache-2.0",
Expand All @@ -21,7 +21,7 @@
"version_requirement": ">= 6.0.0 < 9.0.0"
}
],
"pdk-version": "3.0.1",
"template-url": "https://github.com/puppetlabs/pdk-templates#3.0.1",
"template-ref": "tags/3.0.1-0-gd13288a"
"pdk-version": "3.2.0",
"template-url": "https://github.com/puppetlabs/pdk-templates#3.2.0",
"template-ref": "tags/3.2.0-0-gb257ef1"
}
5 changes: 3 additions & 2 deletions spec/spec_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,16 @@
next unless File.exist?(f) && File.readable?(f) && File.size?(f)

begin
default_facts.merge!(YAML.safe_load(File.read(f), permitted_classes: [], permitted_symbols: [], aliases: true))
require 'deep_merge'
default_facts.deep_merge!(YAML.safe_load(File.read(f), permitted_classes: [], permitted_symbols: [], aliases: true))
rescue StandardError => e
RSpec.configuration.reporter.message "WARNING: Unable to load #{f}: #{e}"
end
end

# read default_facts and merge them over what is provided by facterdb
default_facts.each do |fact, value|
add_custom_fact fact, value
add_custom_fact fact, value, merge_facts: true
end

RSpec.configure do |c|
Expand Down
4 changes: 2 additions & 2 deletions spec/unit/provider/zfs/zfs_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -91,9 +91,9 @@

describe 'zfs properties' do
[:aclinherit, :aclmode, :atime, :canmount, :checksum,
:compression, :copies, :dedup, :devices, :exec, :logbias,
:compression, :copies, :dedup, :defaultuserquota, :devices, :exec, :logbias,
:mountpoint, :nbmand, :overlay, :primarycache, :quota, :readonly,
:recordsize, :refquota, :refreservation, :reservation,
:recordsize, :refquota, :refreservation, :relatime, :reservation,
:secondarycache, :setuid, :shareiscsi, :sharenfs, :sharesmb,
:snapdir, :version, :volsize, :vscan, :xattr].each do |prop|
it "gets #{prop}" do
Expand Down
5 changes: 3 additions & 2 deletions spec/unit/provider/zpool/zpool_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,10 @@
describe 'when there are full path disks on Linux' do
it 'munges partitions into disk names' do
allow(provider).to receive(:execute).with('lsblk -p -no pkname /dev/sdc1').and_return('/dev/sdc')
allow(provider).to receive(:execute).with('lsblk -p -no pkname /dev/nvme0n1p1').and_return('/dev/nvme0n1')
allow(provider).to receive(:execute).with('lsblk -p -no pkname /dev/disk/by-id/disk_serial-0:0-part1').and_return('/dev/disk/by-id/disk_serial-0:0')
zpool_data = ['foo', '/dev/sdc1', '/dev/disk/by-id/disk_serial-0:0-part1']
expect(provider.process_zpool_data(zpool_data)[:disk]).to eq(['/dev/sdc /dev/disk/by-id/disk_serial-0:0'])
zpool_data = ['foo', '/dev/sdc1', '/dev/nvme0n1p1', '/dev/disk/by-id/disk_serial-0:0-part1']
expect(provider.process_zpool_data(zpool_data)[:disk]).to eq(['/dev/sdc /dev/nvme0n1 /dev/disk/by-id/disk_serial-0:0'])
end
end

Expand Down
2 changes: 1 addition & 1 deletion spec/unit/type/zfs_spec.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
require 'spec_helper'

describe Puppet::Type.type(:zfs) do
properties = [:ensure, :mountpoint, :compression, :copies, :overlay, :quota, :reservation, :sharenfs, :snapdir, :sync]
properties = [:ensure, :mountpoint, :compression, :copies, :overlay, :quota, :defaultuserquota, :relatime, :reservation, :sharenfs, :snapdir, :sync]

properties.each do |property|
it "has a #{property} property" do
Expand Down