Add type & provider for managing plugins
This commit is contained in:
parent
0623654438
commit
74132ec038
7 changed files with 230 additions and 0 deletions
12
README.md
12
README.md
|
@ -566,6 +566,17 @@ mysql_grant { 'root@localhost/mysql.user':
|
|||
}
|
||||
```
|
||||
|
||||
####mysql_plugin
|
||||
|
||||
`mysql_plugin` can be used to load plugins into the MySQL Server.
|
||||
|
||||
```puppet
|
||||
mysql_plugin { 'auth_socket':
|
||||
ensure => 'present',
|
||||
soname => 'auth_socket.so',
|
||||
}
|
||||
```
|
||||
|
||||
##Limitations
|
||||
|
||||
This module has been tested on:
|
||||
|
@ -603,4 +614,5 @@ This module is based on work by David Schmitt. The following contributors have c
|
|||
* William Van Hevelingen
|
||||
* Michael Arnold
|
||||
* Chris Weyl
|
||||
* Daniël van Eeden
|
||||
|
||||
|
|
53
lib/puppet/provider/mysql_plugin/mysql.rb
Normal file
53
lib/puppet/provider/mysql_plugin/mysql.rb
Normal file
|
@ -0,0 +1,53 @@
|
|||
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'mysql'))
|
||||
Puppet::Type.type(:mysql_plugin).provide(:mysql, :parent => Puppet::Provider::Mysql) do
|
||||
desc 'Manages MySQL plugins.'
|
||||
|
||||
commands :mysql => 'mysql'
|
||||
|
||||
def self.instances
|
||||
mysql([defaults_file, '-NBe', 'show plugins'].compact).split("\n").collect do |line|
|
||||
name, status, type, library, license = line.split(/\t/)
|
||||
new(:name => name,
|
||||
:ensure => :present,
|
||||
:soname => library
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
# We iterate over each mysql_plugin entry in the catalog and compare it against
|
||||
# the contents of the property_hash generated by self.instances
|
||||
def self.prefetch(resources)
|
||||
plugins = instances
|
||||
resources.keys.each do |plugin|
|
||||
if provider = plugins.find { |pl| pl.name == plugin }
|
||||
resources[plugin].provider = provider
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def create
|
||||
# Use plugin_name.so as soname if it's not specified. This won't work on windows as
|
||||
# there it should be plugin_name.dll
|
||||
@resource[:soname].nil? ? (soname=@resource[:name] + '.so') : (soname=@resource[:soname])
|
||||
mysql([defaults_file, '-NBe', "install plugin #{@resource[:name]} soname '#{soname}'"].compact)
|
||||
|
||||
@property_hash[:ensure] = :present
|
||||
@property_hash[:soname] = @resource[:soname]
|
||||
|
||||
exists? ? (return true) : (return false)
|
||||
end
|
||||
|
||||
def destroy
|
||||
mysql([defaults_file, '-NBe', "uninstall plugin #{@resource[:name]}"].compact)
|
||||
|
||||
@property_hash.clear
|
||||
exists? ? (return false) : (return true)
|
||||
end
|
||||
|
||||
def exists?
|
||||
@property_hash[:ensure] == :present || false
|
||||
end
|
||||
|
||||
mk_resource_methods
|
||||
|
||||
end
|
17
lib/puppet/type/mysql_plugin.rb
Normal file
17
lib/puppet/type/mysql_plugin.rb
Normal file
|
@ -0,0 +1,17 @@
|
|||
Puppet::Type.newtype(:mysql_plugin) do
|
||||
@doc = 'Manage MySQL plugins.'
|
||||
|
||||
ensurable
|
||||
|
||||
autorequire(:file) { '/root/.my.cnf' }
|
||||
|
||||
newparam(:name, :namevar => true) do
|
||||
desc 'The name of the MySQL plugin to manage.'
|
||||
end
|
||||
|
||||
newproperty(:soname) do
|
||||
desc 'The name of the library'
|
||||
newvalue(/^\w+\.\w+$/)
|
||||
end
|
||||
|
||||
end
|
34
spec/acceptance/types/mysql_plugin_spec.rb
Normal file
34
spec/acceptance/types/mysql_plugin_spec.rb
Normal file
|
@ -0,0 +1,34 @@
|
|||
require 'spec_helper_acceptance'
|
||||
|
||||
describe 'mysql_plugin' do
|
||||
describe 'setup' do
|
||||
it 'should work with no errors' do
|
||||
pp = <<-EOS
|
||||
class { 'mysql::server': }
|
||||
EOS
|
||||
|
||||
apply_manifest(pp, :catch_failures => true)
|
||||
end
|
||||
end
|
||||
|
||||
describe 'load plugin' do
|
||||
it 'should work without errors' do
|
||||
pp = <<-EOS
|
||||
mysql_plugin { 'auth_socket':
|
||||
ensure => present,
|
||||
soname => 'auth_socket.so',
|
||||
}
|
||||
EOS
|
||||
|
||||
apply_manifest(pp, :catch_failures => true)
|
||||
end
|
||||
|
||||
it 'should find the plugin' do
|
||||
shell("mysql -NBe \"select plugin_name from information_schema.plugins where plugin_name='auth_socket'\"") do |r|
|
||||
expect(r.stdout).to match(/^auth_socket$/)
|
||||
expect(r.stderr).to be_empty
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
71
spec/unit/puppet/provider/mysql_plugin/mysql_spec.rb
Normal file
71
spec/unit/puppet/provider/mysql_plugin/mysql_spec.rb
Normal file
|
@ -0,0 +1,71 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe Puppet::Type.type(:mysql_plugin).provider(:mysql) do
|
||||
|
||||
let(:defaults_file) { '--defaults-extra-file=/root/.my.cnf' }
|
||||
|
||||
let(:resource) { Puppet::Type.type(:mysql_plugin).new(
|
||||
{ :ensure => :present,
|
||||
:soname => 'auth_socket.so',
|
||||
:name => 'auth_socket',
|
||||
:provider => described_class.name
|
||||
}
|
||||
)}
|
||||
let(:provider) { resource.provider }
|
||||
|
||||
before :each do
|
||||
Facter.stubs(:value).with(:root_home).returns('/root')
|
||||
Puppet::Util.stubs(:which).with('mysql').returns('/usr/bin/mysql')
|
||||
File.stubs(:file?).with('/root/.my.cnf').returns(true)
|
||||
provider.class.stubs(:mysql).with([defaults_file, '-NBe', 'show plugins']).returns('auth_socket ACTIVE AUTHENTICATION auth_socket.so GPL')
|
||||
end
|
||||
|
||||
let(:instance) { provider.class.instances.first }
|
||||
|
||||
describe 'self.prefetch' do
|
||||
it 'exists' do
|
||||
provider.class.instances
|
||||
provider.class.prefetch({})
|
||||
end
|
||||
end
|
||||
|
||||
describe 'create' do
|
||||
it 'loads a plugin' do
|
||||
provider.expects(:mysql).with([defaults_file, '-NBe', "install plugin #{resource[:name]} soname '#{resource[:soname]}'"])
|
||||
provider.expects(:exists?).returns(true)
|
||||
expect(provider.create).to be_truthy
|
||||
end
|
||||
end
|
||||
|
||||
describe 'destroy' do
|
||||
it 'unloads a plugin if present' do
|
||||
provider.expects(:mysql).with([defaults_file, '-NBe', "uninstall plugin #{resource[:name]}"])
|
||||
provider.expects(:exists?).returns(false)
|
||||
expect(provider.destroy).to be_truthy
|
||||
end
|
||||
end
|
||||
|
||||
describe 'exists?' do
|
||||
it 'checks if plugin exists' do
|
||||
expect(instance.exists?).to be_truthy
|
||||
end
|
||||
end
|
||||
|
||||
describe 'self.defaults_file' do
|
||||
it 'sets --defaults-extra-file' do
|
||||
File.stubs(:file?).with('/root/.my.cnf').returns(true)
|
||||
expect(provider.defaults_file).to eq '--defaults-extra-file=/root/.my.cnf'
|
||||
end
|
||||
it 'fails if file missing' do
|
||||
File.stubs(:file?).with('/root/.my.cnf').returns(false)
|
||||
expect(provider.defaults_file).to be_nil
|
||||
end
|
||||
end
|
||||
|
||||
describe 'soname' do
|
||||
it 'returns a soname' do
|
||||
expect(instance.soname).to eq('auth_socket.so')
|
||||
end
|
||||
end
|
||||
|
||||
end
|
24
spec/unit/puppet/type/mysql_plugin_spec.rb
Normal file
24
spec/unit/puppet/type/mysql_plugin_spec.rb
Normal file
|
@ -0,0 +1,24 @@
|
|||
require 'puppet'
|
||||
require 'puppet/type/mysql_plugin'
|
||||
describe Puppet::Type.type(:mysql_plugin) do
|
||||
|
||||
before :each do
|
||||
@plugin = Puppet::Type.type(:mysql_plugin).new(:name => 'test', :soname => 'test.so')
|
||||
end
|
||||
|
||||
it 'should accept a plugin name' do
|
||||
expect(@plugin[:name]).to eq('test')
|
||||
end
|
||||
|
||||
it 'should accept a library name' do
|
||||
@plugin[:soname] = 'test.so'
|
||||
expect(@plugin[:soname]).to eq('test.so')
|
||||
end
|
||||
|
||||
it 'should require a name' do
|
||||
expect {
|
||||
Puppet::Type.type(:mysql_plugin).new({})
|
||||
}.to raise_error(Puppet::Error, 'Title or name must be provided')
|
||||
end
|
||||
|
||||
end
|
19
tests/mysql_plugin.pp
Normal file
19
tests/mysql_plugin.pp
Normal file
|
@ -0,0 +1,19 @@
|
|||
class { 'mysql::server':
|
||||
root_password => 'password'
|
||||
}
|
||||
|
||||
mysql::plugin{ 'validate_password':
|
||||
ensure => present,
|
||||
soname => $::osfamily ? {
|
||||
windows => 'validate_password.dll',
|
||||
default => 'validate_password.so'
|
||||
}
|
||||
}
|
||||
|
||||
mysql::plugin{ 'auth_socket':
|
||||
ensure => present,
|
||||
soname => $::osfamily ? {
|
||||
windows => 'auth_socket.dll',
|
||||
default => 'auth_socket.so'
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue