1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
|
require 'spec_helper'
require 'puppet/file_bucket/dipper'
require 'puppet_spec/files'
require 'puppet_spec/compiler'
describe Puppet::Type.type(:sshkey).provider(:parsed), unless: Puppet.features.microsoft_windows? do
include PuppetSpec::Files
include PuppetSpec::Compiler
let(:sshkey_file) { tmpfile('sshkey_integration_specs') }
let(:type_under_test) { 'sshkey' }
before :each do
# Don't backup to filebucket
allow_any_instance_of(Puppet::FileBucket::Dipper).to receive(:backup) # rubocop:disable RSpec/AnyInstance
# We don't want to execute anything
allow(described_class).to receive(:filetype).and_return Puppet::Util::FileType::FileTypeFlat
FileUtils.cp(my_fixture('sample'), sshkey_file)
end
after :each do
# sshkey provider class
described_class.clear
end
describe 'when managing a ssh known hosts file it...' do
let(:host_alias) { 'r0ckdata.com' }
let(:invalid_type) { 'ssh-er0ck' }
let(:sshkey_name) { 'kirby.madstop.com' }
let(:super_unique) { 'my.super.unique.host' }
it 'creates a new known_hosts file with mode 0644' do
target = tmpfile('ssh_known_hosts')
manifest = "#{type_under_test} { '#{super_unique}':
ensure => 'present',
type => 'rsa',
key => 'TESTKEY',
target => '#{target}' }"
apply_with_error_check(manifest)
expect_file_mode(target, '644')
end
it 'creates an SSH host key entry (ensure present)' do
manifest = "#{type_under_test} { '#{super_unique}':
ensure => 'present',
type => 'rsa',
key => 'mykey',
target => '#{sshkey_file}' }"
apply_with_error_check(manifest)
expect(File.read(sshkey_file)).to match(%r{#{super_unique}.*mykey})
end
it 'creates two SSH host key entries with two keys (ensure present)' do
manifest = "
#{type_under_test} { '#{super_unique}_rsa':
ensure => 'present',
type => 'rsa',
name => '#{super_unique}',
key => 'myrsakey',
target => '#{sshkey_file}', }
#{type_under_test} { '#{super_unique}_dss':
ensure => 'present',
type => 'ssh-dss',
name => '#{super_unique}',
key => 'mydsskey',
target => '#{sshkey_file}' }"
apply_with_error_check(manifest)
expect(File.read(sshkey_file)).to match(%r{#{super_unique}.*myrsakey})
expect(File.read(sshkey_file)).to match(%r{#{super_unique}.*mydsskey})
end
it 'deletes an entry for an SSH host key' do
manifest = "#{type_under_test} { '#{sshkey_name}':
ensure => 'absent',
type => 'rsa',
target => '#{sshkey_file}' }"
apply_with_error_check(manifest)
expect(File.read(sshkey_file)).not_to match(%r{#{sshkey_name}.*Yqk0=})
end
it 'updates an entry for an SSH host key' do
manifest = "#{type_under_test} { '#{sshkey_name}':
ensure => 'present',
type => 'rsa',
key => 'mynewshinykey',
target => '#{sshkey_file}' }"
apply_with_error_check(manifest)
expect(File.read(sshkey_file)).to match(%r{#{sshkey_name}.*mynewshinykey})
expect(File.read(sshkey_file)).not_to match(%r{#{sshkey_name}.*Yqk0=})
end
it 'prioritizes the specified type instead of type in the name' do
manifest = "#{type_under_test} { '#{super_unique}@rsa':
ensure => 'present',
type => 'dsa',
key => 'mykey',
target => '#{sshkey_file}' }"
apply_with_error_check(manifest)
expect(File.read(sshkey_file)).to match(%r{#{super_unique} ssh-dss.*mykey})
end
it 'can parse SSH key type that contains @openssh.com in name' do
manifest = "#{type_under_test} { '#{super_unique}@sk-ssh-ed25519@openssh.com':
ensure => 'present',
key => 'mykey',
target => '#{sshkey_file}' }"
apply_with_error_check(manifest)
expect(File.read(sshkey_file)).to match(%r{#{super_unique} sk-ssh-ed25519@openssh.com.*mykey})
end
# test all key types
types = [
'ssh-dss', 'dsa',
'ssh-ed25519', 'ed25519',
'ssh-rsa', 'rsa',
'ecdsa-sha2-nistp256',
'ecdsa-sha2-nistp384',
'ecdsa-sha2-nistp521',
'ecdsa-sk', 'sk-ecdsa-sha2-nistp256@openssh.com',
'ed25519-sk', 'sk-ssh-ed25519@openssh.com'
]
# these types are treated as aliases for sshkey <ahem> type
# so they are populated as the *values* below
aliases = {
'dsa' => 'ssh-dss',
'ed25519' => 'ssh-ed25519',
'rsa' => 'ssh-rsa',
'ecdsa-sk' => 'sk-ecdsa-sha2-nistp256@openssh.com',
'ed25519-sk' => 'sk-ssh-ed25519@openssh.com',
}
types.each do |type|
it "updates an entry with #{type} type" do
manifest = "#{type_under_test} { '#{sshkey_name}':
ensure => 'present',
type => '#{type}',
key => 'mynewshinykey',
target => '#{sshkey_file}' }"
apply_with_error_check(manifest)
if aliases.key?(type)
full_type = aliases[type]
expect(File.read(sshkey_file)).to match(%r{#{sshkey_name}.*#{full_type}.*mynew})
else
expect(File.read(sshkey_file)).to match(%r{#{sshkey_name}.*#{type}.*mynew})
end
end
end
# test unknown key type fails
it 'raises an error with an unknown type' do
manifest = "#{type_under_test} { '#{sshkey_name}':
ensure => 'present',
type => '#{invalid_type}',
key => 'mynewshinykey',
target => '#{sshkey_file}' }"
expect {
apply_compiled_manifest(manifest)
}.to raise_error(Puppet::ResourceError, %r{Invalid value "#{invalid_type}"})
end
# single host_alias
it 'updates an entry with a single new host_alias' do
manifest = "#{type_under_test} { '#{sshkey_name}':
ensure => 'present',
type => 'rsa',
host_aliases => '#{host_alias}',
target => '#{sshkey_file}' }"
apply_with_error_check(manifest)
expect(File.read(sshkey_file)).to match(%r{#{sshkey_name},#{host_alias}\s})
expect(File.read(sshkey_file)).not_to match(%r{#{sshkey_name}\s})
end
# array host_alias
it 'updates an entry with multiple new host_aliases' do
manifest = "#{type_under_test} { '#{sshkey_name}':
ensure => 'present',
type => 'rsa',
host_aliases => [ 'r0ckdata.com', 'erict.net' ],
target => '#{sshkey_file}' }"
apply_with_error_check(manifest)
expect(File.read(sshkey_file)).to match(%r{#{sshkey_name},r0ckdata\.com,erict\.net\s})
expect(File.read(sshkey_file)).not_to match(%r{#{sshkey_name}\s})
end
# puppet resource sshkey
it 'fetches an entry from resources' do
resource_app = Puppet::Application[:resource]
resource_app.preinit
allow(resource_app.command_line).to receive(:args).and_return([type_under_test, sshkey_name, "target=#{sshkey_file}"])
expect(resource_app).to receive(:puts) do |args|
expect(args).to match(%r{#{sshkey_name}})
end
resource_app.main
end
end
end
|