diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..eb67838 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,11 @@ +# EditorConfig is awesome: http://EditorConfig.org + +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file, indent by 2 spaces +[*] +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 2 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b4a8f51..ab580eb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -79,10 +79,12 @@ with: bundle exec rake acceptance -This will run the tests on an Ubuntu 14.04 virtual machine. You can also -run the integration tests against Centos 6.5 with. +This will run the tests on an Centos 6.5 docker container. You can also +run the integration tests against any other configuration specified in directory `spec/acceptance/nodesets`. For example for Ubuntu 14.04 running on virtualbox via Vagrant you should run: - RS_SET=centos-65-x64-docker bundle exec rake acceptance + RS_SET=ubuntu-14.04-x86_64-vagrant bundle exec rake acceptance + +**Caution!** To run Vagrant boxes when you have installed Vagrant in version 1.5 or above, you need to have `bundler` in version range: >= 1.5.2 <= 1.10.5. This is due to fact of invalid version in vagrant-wrapper gem package. If you don't want to have to recreate the virtual machine every time you can use `BEAKER_DESTROY=no` and `BEAKER_PROVISION=no`. On the first run you will diff --git a/lib/facter/jboss_configfile.rb b/lib/facter/jboss_configfile.rb index b0a28b4..5ea5b95 100644 --- a/lib/facter/jboss_configfile.rb +++ b/lib/facter/jboss_configfile.rb @@ -1,5 +1,5 @@ -require File.expand_path(File.join(File.dirname(__FILE__), '../puppet_x/coi/jboss/configuration')) +require File.expand_path(File.join(File.dirname(__FILE__), '../puppet_x/coi/jboss')) Facter.add(:jboss_configfile) do setcode { Puppet_X::Coi::Jboss::Configuration::configfile } -end \ No newline at end of file +end diff --git a/lib/facter/jboss_fullconfig.rb b/lib/facter/jboss_fullconfig.rb index f418a02..a75c20f 100644 --- a/lib/facter/jboss_fullconfig.rb +++ b/lib/facter/jboss_fullconfig.rb @@ -1,21 +1,3 @@ -require File.expand_path(File.join(File.dirname(__FILE__), '../puppet_x/coi/jboss/configuration')) +require File.expand_path(File.join(File.dirname(__FILE__), '../puppet_x/coi/jboss')) -config = Puppet_X::Coi::Jboss::Configuration::read -unless config.nil? - config.each do |key, value| - fact_symbol = "jboss_#{key}".to_sym - Facter.add(fact_symbol) do - setcode { value } - end - end - Facter.add(:jboss_fullconfig) do - setcode do - if RUBY_VERSION < '1.9.0' - class << config - define_method(:to_s, proc { self.inspect }) - end - end - config - end - end -end +Puppet_X::Coi::Jboss::Facts.define_fullconfig_fact diff --git a/lib/puppet/parser/functions/jboss_basename.rb b/lib/puppet/parser/functions/jboss_basename.rb index 0d1f147..1dfcd62 100644 --- a/lib/puppet/parser/functions/jboss_basename.rb +++ b/lib/puppet/parser/functions/jboss_basename.rb @@ -1,3 +1,5 @@ +require File.join(File.dirname(__FILE__), '../../../puppet_x/coi/jboss') + # Jboss AS private basename function # # jboss_basename(string) : string @@ -8,10 +10,6 @@ # local file system. module Puppet::Parser::Functions newfunction(:jboss_basename, :type => :rvalue) do |args| - if args[0].is_a?(Array) - args.collect do |a| File.basename(a) end - else - File.basename(args[0]) - end + Puppet_X::Coi::Jboss::Functions.jboss_basename args end -end \ No newline at end of file +end diff --git a/lib/puppet/parser/functions/jboss_dirname.rb b/lib/puppet/parser/functions/jboss_dirname.rb index a124580..71fcc92 100644 --- a/lib/puppet/parser/functions/jboss_dirname.rb +++ b/lib/puppet/parser/functions/jboss_dirname.rb @@ -1,3 +1,5 @@ +require File.join(File.dirname(__FILE__), '../../../puppet_x/coi/jboss') + # Jboss AS private dirname function # # jboss_dirname(string) : string @@ -8,10 +10,6 @@ # local file system. module Puppet::Parser::Functions newfunction(:jboss_dirname, :type => :rvalue) do |args| - if args[0].is_a?(Array) - args.collect do |a| File.dirname(a) end - else - File.dirname(args[0]) - end + Puppet_X::Coi::Jboss::Functions.jboss_dirname args end -end \ No newline at end of file +end diff --git a/lib/puppet/parser/functions/jboss_hash_setvalue.rb b/lib/puppet/parser/functions/jboss_hash_setvalue.rb index 4d36ad6..c66d8f5 100644 --- a/lib/puppet/parser/functions/jboss_hash_setvalue.rb +++ b/lib/puppet/parser/functions/jboss_hash_setvalue.rb @@ -5,7 +5,8 @@ # Sets value to Puppet hash module Puppet::Parser::Functions newfunction(:jboss_hash_setvalue) do |args| + raise(Puppet::ParseError, "jboss_hash_setvalue(): wrong lenght of input given (#{args.size} for 3)") if args.size != 3 hash, key, value = args hash[key] = value end -end \ No newline at end of file +end diff --git a/lib/puppet/parser/functions/jboss_short_version.rb b/lib/puppet/parser/functions/jboss_short_version.rb index 86487d0..6e09ed6 100644 --- a/lib/puppet/parser/functions/jboss_short_version.rb +++ b/lib/puppet/parser/functions/jboss_short_version.rb @@ -1,3 +1,5 @@ +require File.join(File.dirname(__FILE__), '../../../puppet_x/coi/jboss') + # Jboss AS private short version function # # jboss_short_version(string) : string @@ -6,9 +8,6 @@ # 'eap-6.2.0.GA' -> '6.2' module Puppet::Parser::Functions newfunction(:jboss_short_version, :type => :rvalue) do |args| - version = args[0] - re = /^(?:[a-z]+-)?(\d+\.\d+)\.\d+(?:\.[A-Za-z]+)?$/ - m = re.match(version) - if m then m[1] else nil end + Puppet_X::Coi::Jboss::Functions.jboss_short_version args end -end \ No newline at end of file +end diff --git a/lib/puppet/parser/functions/jboss_to_bool.rb b/lib/puppet/parser/functions/jboss_to_bool.rb index 852bceb..9c94b29 100644 --- a/lib/puppet/parser/functions/jboss_to_bool.rb +++ b/lib/puppet/parser/functions/jboss_to_bool.rb @@ -1,4 +1,4 @@ -require File.join(File.dirname(__FILE__), '../../../puppet_x/coi/jboss/functions/jboss_to_bool') +require File.join(File.dirname(__FILE__), '../../../puppet_x/coi/jboss') # Jboss AS private to_bool function # @@ -9,4 +9,4 @@ module Puppet::Parser::Functions newfunction(:jboss_to_bool, :type => :rvalue) do |args| Puppet_X::Coi::Jboss::Functions.jboss_to_bool args end -end \ No newline at end of file +end diff --git a/lib/puppet/parser/functions/jboss_to_i.rb b/lib/puppet/parser/functions/jboss_to_i.rb index 5791c3b..a874079 100644 --- a/lib/puppet/parser/functions/jboss_to_i.rb +++ b/lib/puppet/parser/functions/jboss_to_i.rb @@ -1,4 +1,4 @@ -require File.join(File.dirname(__FILE__), '../../../puppet_x/coi/jboss/functions/jboss_to_i') +require File.join(File.dirname(__FILE__), '../../../puppet_x/coi/jboss') # Jboss AS private to_i function # @@ -9,4 +9,4 @@ module Puppet::Parser::Functions newfunction(:jboss_to_i, :type => :rvalue) do |args| Puppet_X::Coi::Jboss::Functions.jboss_to_i args end -end \ No newline at end of file +end diff --git a/lib/puppet/parser/functions/jboss_to_s.rb b/lib/puppet/parser/functions/jboss_to_s.rb index e0938b0..ce3fe86 100644 --- a/lib/puppet/parser/functions/jboss_to_s.rb +++ b/lib/puppet/parser/functions/jboss_to_s.rb @@ -1,4 +1,4 @@ -require File.join(File.dirname(__FILE__), '../../../puppet_x/coi/jboss/functions/jboss_to_s') +require File.join(File.dirname(__FILE__), '../../../puppet_x/coi/jboss') # Jboss AS private to_s function # @@ -9,4 +9,4 @@ module Puppet::Parser::Functions newfunction(:jboss_to_s, :type => :rvalue) do |args| Puppet_X::Coi::Jboss::Functions.jboss_to_s args end -end \ No newline at end of file +end diff --git a/lib/puppet/parser/functions/jboss_type_version.rb b/lib/puppet/parser/functions/jboss_type_version.rb index ad91f77..fa01b57 100644 --- a/lib/puppet/parser/functions/jboss_type_version.rb +++ b/lib/puppet/parser/functions/jboss_type_version.rb @@ -1,3 +1,5 @@ +require File.join(File.dirname(__FILE__), '../../../puppet_x/coi/jboss') + # Jboss AS private type version function # # jboss_type_version(string) : string @@ -6,9 +8,6 @@ # 'eap-6.2.0.GA' -> 'eap' module Puppet::Parser::Functions newfunction(:jboss_type_version, :type => :rvalue) do |args| - version = args[0] - re = /^([a-z]+)-(?:\d+\.\d+)\.\d+(?:\.[A-Za-z]+)?$/ - m = re.match(version) - if m then m[1] else nil end + Puppet_X::Coi::Jboss::Functions.jboss_type_version args end -end \ No newline at end of file +end diff --git a/lib/puppet/provider/jboss_confignode/jbosscli.rb b/lib/puppet/provider/jboss_confignode/jbosscli.rb index 6e5f33b..0c798d5 100644 --- a/lib/puppet/provider/jboss_confignode/jbosscli.rb +++ b/lib/puppet/provider/jboss_confignode/jbosscli.rb @@ -1,301 +1,12 @@ -require File.expand_path(File.join(File.dirname(File.dirname(__FILE__)), 'jbosscli.rb')) +require File.expand_path(File.join(File.dirname(__FILE__), '../../../puppet_x/coi/jboss')) -Puppet::Type.type(:jboss_confignode).provide(:jbosscli, :parent => Puppet::Provider::Jbosscli) do - desc "JBoss CLI configuration node provider" - - @clean = false - @data = nil - - def create - trace 'create' - if exists? - return - end - ret = bringUp 'Configuration node', "#{compiledpath}:add(#{compileprops})" - invalidate - return ret - end +Puppet::Type.type(:jboss_confignode).provide(:jbosscli, + :parent => Puppet_X::Coi::Jboss::Provider::AbstractJbossCli) do - def destroy - trace 'destroy' - if not exists? - return - end - if status == :running - doStop - end - ret = bringDown 'Configuration node', "#{compiledpath}:remove()" - invalidate - return ret - end - - def exists? - trace 'exists?' + desc 'JBoss CLI configuration node provider' - if @clean - return (not @data.nil?) - end - if @resource[:path].nil? - @resource[:path] = @resource[:name] - end - @resource[:properties] = {} if @resource[:properties].nil? - @resource[:properties].each do |key, value| - if value == "undef" or value == :undef - @resource[:properties][key] = nil - end - end - - res = executeAndGet "#{compiledpath}:read-resource(include-runtime=true, include-defaults=false)" - if res[:result] - @data = {} - res[:data].each do |key, value| - props = @resource[:properties] - @data[key] = value - if not @property_hash.key? :properties - @property_hash[:properties] = {} - end - if props.key? key - @property_hash[:properties][key] = value - end - end - @clean = true - traceout 'status()', true - return true - end - @clean = true - @data = nil - traceout 'status()', false - return false - end - - def status - trace 'status' - meth = self.method 'ensure' - ret = meth.call - traceout 'status()', ret - return ret - end - - def ensure - trace 'ensure' + @clean = false + @data = nil - exists? - if @data.nil? - @property_hash[:ensure] = :absent - traceout 'ensure()', :absent - return :absent - end - if not @data['status'].nil? - st = @data['status'].upcase - if st == 'DISABLED' - @property_hash[:ensure] = :disabled - traceout 'ensure()', :disabled - return :disabled - end - if ['RUNNING', 'STARTED'].include? st - @property_hash[:ensure] = :running - traceout 'ensure()', :running - return :running - else - @property_hash[:ensure] = :stopped - traceout 'ensure()', :stopped - return :stopped - end - end - if not @data['enabled'].nil? - if @data['enabled'] - @property_hash[:ensure] = :enabled - traceout 'ensure()', :enabled - return :enabled - else - @property_hash[:ensure] = :disabled - traceout 'ensure()', :disabled - return :disabled - end - end - if @data.length > 0 - @property_hash[:ensure] = :present - traceout 'ensure()', :present - return :present - end - end - - def ensure= value - trace 'ensure=(%s)' % [ value.inspect ] - case value - when :present then create - when :absent then destroy - when :running then doStart - when :stopped then doStop - when :enabled then doEnable - when :disabled then doDisable - end - traceout 'ensure=(%s)' % value.inspect, value.inspect - return value - end - - def enabled? - trace 'enabled?' - - return status == :running - end - - def stopped? - trace 'stopped?' - - return status == :stopped - end - - def enabled? - trace 'enabled?' - - return status == :enabled - end - - def disabled? - trace 'disabled?' - - return status == :disabled - end - - def present? - trace 'present?' - - return status == :present - end - - def absent? - trace 'absent?' - - return status == :absent - end - - def properties - trace 'properties()' - - if @data.nil? - traceout 'properties()', {} - return {} - else - hash = {} - @property_hash[:properties] = {} if @property_hash[:properties].nil? - @property_hash[:properties].each do |k, v| - if v.nil? or !!v == v or v.is_a? Numeric or v.is_a? Hash or v.is_a? Array - hash[k.to_s] = v - else - hash[k.to_s] = v.to_s - end - end - traceout 'properties()', hash - return hash - end - end - - def properties= newprops - trace 'properties=(%s)' % newprops.inspect - - # Sorting by value to process `nil` values first - sorted = newprops.sort do |a, b| - if a[1] == b[1] - 0 - elsif a[1].nil? and not b[1].nil? - -1 - elsif not a[1].nil? and b[1].nil? - 1 - else - 0 - end - end - sorted.each do |arr| - key, value = arr - if not @data.key? key or @data[key] != value - writekey key, value - Puppet.notice "JBoss::Property: Key `#{key}` with value `#{value.inspect}` for path `#{compiledpath}` has been set." - end - end - end - - private - - def doStart - trace 'doStart' - - if status == :absent - create - end - ret = bringUp 'Configuration node START', "#{compiledpath}:start(blocking=true)" - invalidate - traceout 'doStart', ret - return ret - end - - def doStop - trace 'doStop' - - if status == :absent - create - end - ret = bringDown 'Configuration node STOP', "#{compiledpath}:stop(blocking=true)" - invalidate - return ret - end - - def doEnable - trace 'doEnable' - - if status == :absent - create - end - ret = bringUp 'Configuration node ENABLE', "#{compiledpath}:enable()" - invalidate - return ret - end - - def doDisable - trace 'doDisable' - - if status == :absent - create - end - ret = bringDown 'Configuration node DISABLE', "#{compiledpath}:disable()" - invalidate - return ret - end - - def invalidate - trace 'invalidate' - - @clean = false - end - - def writekey key, value - trace 'writekey(%s,%s)' % [key.inspect, value.inspect] - - invalidate - if value.nil? - bringDown 'Configuration node property', "#{compiledpath}:undefine-attribute(name=#{key})" - else - preparedval = escape value - bringUp 'Configuration node property', "#{compiledpath}:write-attribute(name=#{key}, value=#{preparedval})" - end - end - - def compiledpath - trace 'compiledpath' - - path = @resource[:path] - cmd = compilecmd path - end - - def compileprops - trace 'compileprops' - - props = @resource[:properties] - arr = [] - props.each do |key, value| - preparedval = escape value - arr.push "#{key}=#{preparedval}" - end - arr.join ', ' - end + include Puppet_X::Coi::Jboss::Provider::ConfigNode end diff --git a/lib/puppet/provider/jboss_datasource/jbosscli.rb b/lib/puppet/provider/jboss_datasource/jbosscli.rb index 9ae4769..fdb6d61 100644 --- a/lib/puppet/provider/jboss_datasource/jbosscli.rb +++ b/lib/puppet/provider/jboss_datasource/jbosscli.rb @@ -1,563 +1,19 @@ -require File.expand_path(File.join(File.dirname(File.dirname(__FILE__)), 'jbosscli.rb')) -require File.expand_path(File.join(File.dirname(__FILE__), '../../../puppet_x/coi/jboss/configuration')) -require File.expand_path(File.join(File.dirname(__FILE__), '../../../puppet_x/coi/jboss/provider/datasource/pre_wildfly_provider')) -require File.expand_path(File.join(File.dirname(__FILE__), '../../../puppet_x/coi/jboss/provider/datasource/post_wildfly_provider')) +require File.expand_path(File.join(File.dirname(__FILE__), '../../../puppet_x/coi/jboss')) require 'uri' -Puppet::Type.type(:jboss_datasource).provide(:jbosscli, :parent => Puppet::Provider::Jbosscli) do - desc "JBoss CLI datasource provider" +Puppet::Type.type(:jboss_datasource).provide(:jbosscli, + :parent => Puppet_X::Coi::Jboss::Provider::AbstractJbossCli) do - @data = nil - @readed = false - @impl = nil - - def create - cmd = [ "#{create_delete_cmd} add --name=#{@resource[:name]}" ] - jta_opt(cmd) - cmd.push "--jndi-name=#{@resource[:jndiname].inspect}" - cmd.push "--driver-name=#{@resource[:drivername].inspect}" - cmd.push "--min-pool-size=#{@resource[:minpoolsize].inspect}" - cmd.push "--max-pool-size=#{@resource[:maxpoolsize].inspect}" - cmd.push "--user-name=#{@resource[:username].inspect}" - cmd.push "--password=#{@resource[:password].inspect}" - if @resource[:xa] - xa_properties = xa_datasource_properties_wrapper(createXaProperties) - cmd.push "--xa-datasource-properties=#{xa_properties}" - else - cmd.push "--connection-url=#{connectionUrl.inspect}" - end - @resource[:options].each do |attribute, value| - cmd.push "--#{attribute}=#{value.inspect}" - end - - bringUp 'Datasource', cmd.join(' ') - setenabled true - end - - def destroy - cmd = "#{create_delete_cmd} remove --name=#{@resource[:name]}" - bringDown 'Datasource', cmd - end - - def self.instances - runasdomain = self.config_runasdomain - profile = self.config_profile - controller = self.config_controller - ctrlconfig = self.controllerConfig({ :controller => controller }) - list = [] - cmd = self.compilecmd runasdomain, profile, "/subsystem=datasources:read-children-names(child-type=#{self.datasource_type true})" - res = self.executeAndGet cmd, runasdomain, ctrlconfig, 0, 0 - if res[:result] - res[:data].each do |name| - inst = self.create_rubyobject name, true, runasdomain, profile, controller - list.push inst - end - end - cmd = self.compilecmd runasdomain, profile, "/subsystem=datasources:read-children-names(child-type=#{self.datasource_type false})" - res = self.executeAndGet cmd, runasdomain, ctrlconfig, 0, 0 - if res[:result] - res[:data].each do |name| - inst = self.create_rubyobject name, false, runasdomain, profile, controller - list.push inst - end - end - return list - end - - def setenabled setting - Puppet.debug "setenabled #{setting.inspect}" - cmd = compilecmd "#{datasource_path}:read-attribute(name=enabled)" - res = executeAndGet cmd - enabled = res[:data] - Puppet.debug "Enabling datasource #{@resource[:name]} = #{enabled}: #{setting}" - if enabled != setting - if setting - cmd = compilecmd "#{datasource_path}:enable(persistent=true)" - else - cmd = compilecmd "#{datasource_path}:disable(persistent=true)" - end - bringUp "Datasource enable set to #{setting.to_s}", cmd - end - end - - def prepare_resource - if @resource.nil? - @resource = {} - end - if @resource[:name].nil? - @resource[:name] = @property_hash[:name] - end - if @resource[:controller].nil? - @resource[:controller] = controller - end - if @resource[:runasdomain].nil? - @resource[:runasdomain] = runasdomain - end - if @resource[:profile].nil? - @resource[:profile] = profile - end - if @resource[:xa].nil? - @resource[:xa] = xa - end - end - - def exists? - prepare_resource - if @resource[:dbname].nil? - @resource[:dbname] = @resource[:name] - end - @data = nil - cmd = compilecmd "#{datasource_path}:read-resource(recursive=true)" - res = executeAndGet cmd - if(res[:result] == false) - Puppet.debug "Datasorce (xa: #{xa?}) `#{@resource[:name]}` does NOT exist" - return false - end - Puppet.debug "Datasorce (xa: #{xa?}) `#{@resource[:name]}` exists: #{res[:data].inspect}" - @data = res[:data] - return true - end - - def name - @property_hash[:name] - end - - def getproperty name, default=nil - if @property_hash.nil? or (@property_hash.respond_to? :key? and not @property_hash.key? name) or @property_hash[name].nil? - return default - end - return @property_hash[name] - end - def xa - setting = getproperty :xa, nil - if not setting.nil? - return setting - else - return xa? - end - end - def xa= value - actual = getproperty :xa, false - if actual.to_s != value.to_s - destroy - create - end - end - def controller - getproperty :controller - end - def profile - getproperty :profile, default_profile - end - def runasdomain - getproperty :runasdomain - end - - def jndiname - getattrib 'jndi-name' - end - - def jndiname= value - setattrib 'jndi-name', value - end - - def drivername - getattrib 'driver-name' - end + desc 'JBoss CLI datasource provider' - def drivername= value - setattrib 'driver-name', value - end - - def minpoolsize - getattrib('min-pool-size').to_s - end - - def minpoolsize= value - setattrib 'min-pool-size', value - end - - def maxpoolsize - getattrib('max-pool-size').to_s - end - - def maxpoolsize= value - setattrib 'max-pool-size', value - end - - def username - getattrib('user-name') - end - - def username= value - setattrib 'user-name', value - end - - def password - getattrib('password') - end - - def password= value - setattrib 'password', value - end - - def options - managed_fetched_options - end - - def options= value - absentlike = [:absent, :undef, nil] - managed_fetched_options.each do |key, fetched_value| - if absentlike.include?(value) - expected_value = nil - else - expected_value = value[key] - end - if expected_value != fetched_value - setattrib(key, expected_value) - end - end - end - - def enabled - getattrib('enabled').to_s - end - - def enabled= value - Puppet.debug "Enabling datasource #{@resource[:name]} to #{value}" - setenabled value - end - - def jdbcscheme - connectionHash()[:Scheme] - end - - def jdbcscheme= value - writeConnection :Scheme, value - end - - def host - connectionHash()[:ServerName].to_s - end - - def host= value - writeConnection :ServerName, value - end - - def port - connectionHash()[:PortNumber].to_i - end - - def port= value - writeConnection :PortNumber, value - end - - def dbname - connectionHash()[:DatabaseName] - end - - def dbname= value - writeConnection :DatabaseName, value - end - - def getattrib name, default=nil - if not @readed - exists? - @readed = true - end - if not @data.nil? and @data.key? name - return @data[name] - end - return default - end - - def setattrib name, value - setattribute datasource_path, name, value - @data[name] = value - end - - def jta - provider_impl.jta - end - - def jta= value - provider_impl.jta = value - end - - def xa? - if not @resource[:xa].nil? - return @resource[:xa] - else - return false - end - end - - def xa_datasource_properties_wrapper(parameters) - provider_impl.xa_datasource_properties_wrapper(parameters) - end - - def jta_opt(cmd) - provider_impl.jta_opt(cmd) - end - - protected - - def default_profile - 'full' - end - - private + @data = nil + @readed = false + @impl = nil - def provider_impl - if @impl.nil? - if Puppet_X::Coi::Jboss::Configuration::is_pre_wildfly? - @impl = Puppet_X::Coi::Jboss::Provider::Datasource::PreWildFlyProvider.new(self) - else - @impl = Puppet_X::Coi::Jboss::Provider::Datasource::PostWildFlyProvider.new(self) - end - end - @impl - end + include Puppet_X::Coi::Jboss::Provider::Datasource - def managed_fetched_options - fetched = {} - @resource[:options].each do |k, v| - fetched[k] = getattrib(k) - end - fetched - end - - def self.create_rubyobject name, xa, runasdomain, profile, controller - props = { - :name => name, - :ensure => :present, - :provider => :jbosscli, - :xa => xa, - :runasdomain => runasdomain, - :profile => profile, - :controller => controller - } - obj = new(props) - return obj + class << self + include Puppet_X::Coi::Jboss::Provider::Datasource::Static end - def createXaProperties - if @resource[:drivername] == 'h2' - "URL=#{connectionUrl.inspect}" - else - out = [] - props = [:ServerName, :PortNumber, :DatabaseName] - props.each do |prop| - value = @resource[getPuppetKey prop] - out.push "#{prop.to_s}=#{value.inspect}" - end - if oracle? - out.push 'DriverType="thin"' - end - out.join ',' - end - end - - def writeConnection property, value - if xa? - if h2? - writeXaProperty 'URL', connectionUrl - else - writeXaProperty property, value - end - else - readed = getattrib('connection-url') - url = connectionUrl - if readed.nil? or readed != url - setattrib 'connection-url', url - end - end - end - - def getPuppetKey property - case property - when :Scheme - return :jdbcscheme - when :ServerName - return :host - when :PortNumber - return :port - when :DatabaseName - return :dbname - else - raise 'Unknown property: ' + property - end - end - - def writeXaProperty property, value - if property == :Scheme - getattrib('xa-datasource-properties')[property.to_s]['value'] = value - return - end - cmd = compilecmd "#{datasource_path}/xa-datasource-properties=#{property.to_s}:read-resource()" - if execute(cmd)[:result] - cmd = compilecmd "#{datasource_path}/xa-datasource-properties=#{property.to_s}:remove()" - bringDown "XA Datasource Property " + property.to_s, cmd - end - cmd = compilecmd "#{datasource_path}/xa-datasource-properties=#{property.to_s}:add(value=#{escape value})" - bringUp "XA Datasource Property set " + property.to_s, cmd - props = getattrib 'xa-datasource-properties' - props = {} if props.nil? - props[property.to_s] = {} if props[property.to_s].nil? - props[property.to_s]['value'] = value - end - - def readXaProperty property - if property == :Scheme - key = getPuppetKey property - scheme = @resource[key] - if getattrib('xa-datasource-properties')[property.to_s].nil? - getattrib('xa-datasource-properties')[property.to_s] = {} - end - getattrib('xa-datasource-properties')[property.to_s]['value'] = scheme - return scheme - end - readed = getattrib('xa-datasource-properties') - key = property.to_s - if readed.nil? or readed[key].nil? or readed[key]['value'].blank? - name = @resource[:name] - cmd = compilecmd "#{datasource_path}/xa-datasource-properties=#{key}:read-attribute(name=value)" - result = executeAndGet cmd - readed[key]['value'] = result[:data] - end - return readed[key]['value'] - end - - def connectionHashFromXa - if h2? - parseConnectionUrl(readXaProperty 'URL') - else - props = [:Scheme, :ServerName, :PortNumber, :DatabaseName] - out = {} - props.each do |sym| - property = readXaProperty sym - out[sym] = property - end - out - end - end - - def connectionHashFromStd - parseConnectionUrl getattrib('connection-url').to_s - end - - def connectionHash - empty = { - :Scheme => nil, - :ServerName => nil, - :PortNumber => nil, - :DatabaseName => nil, - } - begin - if xa? then connectionHashFromXa else connectionHashFromStd end - rescue ArgumentError => e - Puppet.debug e - return empty - end - end - - def oracle? - scheme = @resource[:jdbcscheme] - scheme[0, 6] == 'oracle' - end - - def h2? - scheme = @resource[:jdbcscheme] - scheme[0, 2] == 'h2' - end - - def create_delete_cmd - cmd = "data-source" - if xa? - cmd = "xa-#{cmd}" - end - if @resource[:runasdomain] - cmd = "#{cmd} --profile=#{@resource[:profile]}" - end - return cmd - end - - def datasource_type - if xa? - "xa-data-source" - else - "data-source" - end - end - - def self.datasource_type xa - if xa - "xa-data-source" - else - "data-source" - end - end - - def datasource_path - "/subsystem=datasources/#{datasource_type}=#{@resource[:name]}" - end - - def parseOracleConnectionUrl(url) - splited = url.split '@' - scheme = splited[0].sub 'jdbc:', '' - host, port, dbname = splited[1].split ':' - return { - :Scheme => scheme, - :ServerName => host, - :PortNumber => port.to_i, - :DatabaseName => dbname, - } - end - - def parseH2ConnectionUrl(url) - repl = url.sub('h2:', 'h2-') - parsed = parseOtherDbConnectionUrl(repl) - parsed[:Scheme] = parsed[:Scheme].sub('h2-', 'h2:') - parsed - end - - def parseOtherDbConnectionUrl(url) - uri = URI(url.sub('jdbc:', '')) - return { - :Scheme => uri.scheme, - :ServerName => uri.host, - :PortNumber => uri.port, - :DatabaseName => uri.path[1..-1], - } - end - - def parseConnectionUrl url - begin - if oracle? - parseOracleConnectionUrl(url) - elsif h2? - parseH2ConnectionUrl(url) - else - parseOtherDbConnectionUrl(url) - end - rescue NoMethodError, ArgumentError, RuntimeError => e - raise ArgumentError, "Invalid connection url: #{url}: #{e}" - end - end - - def connectionUrl - scheme = @resource[:jdbcscheme] - host = @resource[:host] - port = @resource[:port] - dbname = @resource[:dbname] - if oracle? - port = 1521 if port <= 0 - url = "#{scheme}@#{host}:#{port}:#{dbname}" - else - port_with_colon = if port > 0 then ":#{port}" else '' end - url = "#{scheme}://#{host}#{port_with_colon}/#{dbname}" - end - return "jdbc:#{url}" - end - end diff --git a/lib/puppet/provider/jboss_deploy/jbosscli.rb b/lib/puppet/provider/jboss_deploy/jbosscli.rb index 6e9b080..207c0e7 100644 --- a/lib/puppet/provider/jboss_deploy/jbosscli.rb +++ b/lib/puppet/provider/jboss_deploy/jbosscli.rb @@ -1,99 +1,9 @@ -require File.expand_path(File.join(File.dirname(File.dirname(__FILE__)), 'jbosscli.rb')) +require File.expand_path(File.join(File.dirname(__FILE__), '../../../puppet_x/coi/jboss')) -Puppet::Type.type(:jboss_deploy).provide(:jbosscli, :parent => Puppet::Provider::Jbosscli) do +Puppet::Type.type(:jboss_deploy).provide(:jbosscli, + :parent => Puppet_X::Coi::Jboss::Provider::AbstractJbossCli) do - def create - cmd = "deploy #{@resource[:source]} --name=#{@resource[:name]}" - if @resource[:runasdomain] - servergroups = @resource[:servergroups] - if servergroups.nil? or servergroups.empty? or servergroups == [''] - cmd = "#{cmd} --all-server-groups" - else - cmd = "#{cmd} --server-groups=#{servergroups.join(',')}" - end - end - if @resource[:redeploy] - cmd = "#{cmd} --force" - end - isprintinglog = 100 - bringUp 'Deployment', cmd - end + desc 'JBoss CLI deploy provider' - def destroy - cmd = "undeploy #{@resource[:name]}" - if @resource[:runasdomain] - servergroups = @resource[:servergroups] - if servergroups.nil? or servergroups.empty? or servergroups == [''] - cmd = "#{cmd} --all-relevant-server-groups" - else - cmd = "#{cmd} --server-groups=#{@resource[:servergroup]}" - end - end - isprintinglog = 0 - bringDown 'Deployment', cmd - end - - def name_exists? - res = executeWithoutRetry "deployment-info --name=#{@resource[:name]}" - if res[:result] == false - return false - end - for line in res[:lines] - line.strip! - if line =~ /^#{@resource[:name]}[ ]+/ - Puppet.debug "Deployment found: #{line}" - return true - end - end - Puppet.debug "No deployment matching #{@resource[:name]} found." - return false - end - - def is_exact_deployment? - true - end - - def exists? - if name_exists? - is_exact_deployment? - else - false - end - end - - def servergroups - if not @resource[:runasdomain] - return @resource[:servergroups] - end - servergroups = @resource[:servergroups] - res = execute("deployment-info --name=#{@resource[:name]}") - if not res[:result] - return [] - end - groups = [] - for line in res[:lines] - line.strip! - depinf = line.split - if(depinf[1] == "enabled" || depinf[1] == "added") - groups.push(depinf[0]) - end - end - if servergroups.nil? or servergroups.empty? or servergroups == [''] - return servergroups - end - return groups - end - - def servergroups=(value) - if not @resource[:runasdomain] - return nil - end - current = servergroups() - Puppet.debug(current.inspect()) - Puppet.debug(value.inspect()) - - toset = value - current - cmd = "deploy --name=#{@resource[:name]} --server-groups=#{toset.join(',')}" - res = bringUp('Deployment', cmd) - end + include Puppet_X::Coi::Jboss::Provider::Deploy end diff --git a/lib/puppet/provider/jboss_jdbcdriver/jbosscli.rb b/lib/puppet/provider/jboss_jdbcdriver/jbosscli.rb index 3ab499e..9a37d6b 100644 --- a/lib/puppet/provider/jboss_jdbcdriver/jbosscli.rb +++ b/lib/puppet/provider/jboss_jdbcdriver/jbosscli.rb @@ -1,102 +1,11 @@ -require File.expand_path(File.join(File.dirname(File.dirname(__FILE__)), 'jbosscli.rb')) +require File.expand_path(File.join(File.dirname(__FILE__), '../../../puppet_x/coi/jboss')) -Puppet::Type.type(:jboss_jdbcdriver).provide(:jbosscli, :parent => Puppet::Provider::Jbosscli) do - - @data = {} +Puppet::Type.type(:jboss_jdbcdriver).provide(:jbosscli, + :parent => Puppet_X::Coi::Jboss::Provider::AbstractJbossCli) do - def create - name = @resource[:name] - map = get_attribs_map - - cmd = compilecmd "/subsystem=datasources/jdbc-driver=#{name}:add(#{cmdlize_attribs_map map})" - bringUp 'JDBC-Driver', cmd - end + desc 'JBoss CLI JDBC driver provider' - def destroy - cmd = compilecmd "/subsystem=datasources/jdbc-driver=#{@resource[:name]}:remove" - bringDown 'JDBC-Driver', cmd - end - - def exists? - @data = {} - cmd = compilecmd "/subsystem=datasources/jdbc-driver=#{@resource[:name]}:read-resource(recursive=true)" - res = executeAndGet cmd - if(res[:result] == false) - Puppet.debug("JDBC Driver #{@resource[:name]} does NOT exist") - return false - end - Puppet.debug("JDBC Driver exists: #{res[:data].inspect}") - @data = res[:data] - return true - end - - def setattrib name, value - Puppet.debug(name + ' setting to ' + value) - cmd = compilecmd "/subsystem=datasources/jdbc-driver=#{@resource[:name]}:write-attribute(name=#{name}, value=#{value})" - res = executeAndGet cmd - Puppet.debug res.inspect - if not res[:result] - raise "Cannot set #{name}: #{res[:data]}" - end - @data[name] = value - end - - def classname - @data['driver-class-name'] - end - - def classname= value - setattrib 'driver-class-name', value - end - - def modulename - @data['driver-module-name'] - end - - def modulename= value - setattrib 'driver-module-name', value - end - - def datasourceclassname - @data['driver-datasource-class-name'] - end - - def datasourceclassname= value - setattrib 'driver-datasource-class-name', value - end - - def xadatasourceclassname - @data['driver-xa-datasource-class-name'] - end - - def xadatasourceclassname= value - setattrib 'driver-xa-datasource-class-name', value - end - - private - - def get_attribs_map - name = @resource[:name] - modulename = @resource[:modulename] - datasourceclassname = @resource[:datasourceclassname] - xadatasourceclassname = @resource[:xadatasourceclassname] - classname = @resource[:classname] - map = { - 'driver-name' => name, - 'driver-module-name' => modulename - } - map['driver-datasource-class-name'] = datasourceclassname if datasourceclassname - map['driver-xa-datasource-class-name'] = xadatasourceclassname if xadatasourceclassname - map['driver-class-name'] = classname if classname - map - end - - def cmdlize_attribs_map input - list = [] - input.each do |key, value| - list.push "#{key}=#{value.inspect}" - end - list.join ',' - end + @data = {} + include Puppet_X::Coi::Jboss::Provider::Jdbcdriver end diff --git a/lib/puppet/provider/jboss_jmsqueue/jbosscli.rb b/lib/puppet/provider/jboss_jmsqueue/jbosscli.rb index ddb3152..17a39d0 100644 --- a/lib/puppet/provider/jboss_jmsqueue/jbosscli.rb +++ b/lib/puppet/provider/jboss_jmsqueue/jbosscli.rb @@ -1,89 +1,6 @@ -require File.expand_path(File.join(File.dirname(File.dirname(__FILE__)), 'jbosscli.rb')) +require File.expand_path(File.join(File.dirname(__FILE__), '../../../puppet_x/coi/jboss')) -Puppet::Type.type(:jboss_jmsqueue).provide(:jbosscli, :parent => Puppet::Provider::Jbosscli) do - def create - if runasdomain? - profile = "--profile=#{@resource[:profile]}" - else - profile = '' - end - entries = @resource[:entries].join '", "' - if not entries.empty? - entries = '["%s"]' % entries - else - raise "Array of entries can not be empty" - end - durable = @resource[:durable].to_bool - extcmd = "/extension=org.jboss.as.messaging" - if not execute("#{extcmd}:read-resource()")[:result] - bringUp "Extension - messaging", "#{extcmd}:add()" - end - syscmd = compilecmd "/subsystem=messaging" - if not execute("#{syscmd}:read-resource()")[:result] - bringUp "Subsystem - messaging", "#{syscmd}:add()" - end - hornetcmd = compilecmd "/subsystem=messaging/hornetq-server=default" - if not execute("#{hornetcmd}:read-resource()")[:result] - bringUp "Default HornetQ", "#{hornetcmd}:add()" - end - cmd = "jms-queue #{profile} add --queue-address=#{@resource[:name]} --entries=#{entries} --durable=\"#{durable.to_s}\"" - bringUp "JMS Queue", cmd - end - - def destroy - if runasdomain? - profile = "--profile=#{@resource[:profile]}" - else - profile = '' - end - cmd = "jms-queue #{profile} remove --queue-address=#{@resource[:name]}" - bringDown "JMS Queue", cmd - end - - # - def exists? - $data = nil - cmd = compilecmd "/subsystem=messaging/hornetq-server=default/jms-queue=#{@resource[:name]}:read-resource()" - res = executeAndGet cmd - - if not res[:result] - Puppet.debug "JMS Queue do not exists" - return false - end - $data = res[:data] - return true - end - - def durable - trace 'durable' - Puppet.debug "Durable given: #{@resource[:durable].inspect}" - $data['durable'].to_bool.to_s - end - - def durable= value - trace 'durable= %s' % value.to_s - setattr 'durable', ('"%s"' % value.to_bool) - end - - def entries - trace 'entries' - $data['entries'] - end - - def entries= value - trace 'entries= %s' % value.inspect - entries = value.join '", "' - if not entries.empty? - entries = '["%s"]' % entries - else - raise "Array of entries can not be empty" - end - setattr 'entries', entries - end - - private - - def setattr name, value - setattribute_raw "/subsystem=messaging/hornetq-server=default/jms-queue=#{@resource[:name]}", name, value - end +Puppet::Type.type(:jboss_jmsqueue).provide(:jbosscli, + :parent => Puppet_X::Coi::Jboss::Provider::AbstractJbossCli) do + include Puppet_X::Coi::Jboss::Provider::Jmsqueue end diff --git a/lib/puppet/provider/jboss_resourceadapter/jbosscli.rb b/lib/puppet/provider/jboss_resourceadapter/jbosscli.rb index c6679ea..c167b65 100644 --- a/lib/puppet/provider/jboss_resourceadapter/jbosscli.rb +++ b/lib/puppet/provider/jboss_resourceadapter/jbosscli.rb @@ -1,8 +1,8 @@ -require File.expand_path(File.join(File.dirname(__FILE__), '../../../puppet_x/coi/jboss/functions/jboss_to_bool')) -require File.expand_path(File.join(File.dirname(File.dirname(__FILE__)), 'jbosscli.rb')) +require File.expand_path(File.join(File.dirname(__FILE__), '../../../puppet_x/coi/jboss')) + +Puppet::Type.type(:jboss_resourceadapter).provide(:jbosscli, + :parent => Puppet_X::Coi::Jboss::Provider::AbstractJbossCli) do -Puppet::Type.type(:jboss_resourceadapter).provide(:jbosscli, :parent => Puppet::Provider::Jbosscli) do - def create name = @resource[:name] jndiname = @resource[:jndiname] @@ -17,7 +17,7 @@ def destroy cmd = compilecmd "/subsystem=resource-adapters/resource-adapter=#{@resource[:name]}:remove()" bringDown "Resource adapter", cmd end - + def exists? $data = nil cmd = compilecmd "/subsystem=resource-adapters/resource-adapter=#{@resource[:name]}:read-resource(recursive=true)" @@ -29,23 +29,23 @@ def exists? $data = res[:data] return true end - + def archive $data['archive'] end - + def archive= value - setbasicattr 'archive', value + setbasicattr 'archive', value end - + def transactionsupport $data['transaction-support'] end - + def transactionsupport= value - setbasicattr 'transaction-support', value + setbasicattr 'transaction-support', value end - + def jndiname jndis = [] if $data['connection-definitions'].nil? @@ -62,7 +62,7 @@ def jndiname Puppet.debug "JNDI getter -------- POST! => #{jndis.inspect}" return jndis end - + def jndiname= value Puppet.debug "JNDI setter -------- PRE!" names = jndiname @@ -71,7 +71,7 @@ def jndiname= value toadd = value - names # New array minus existing provides array to be added trace 'jndiname=(%s) :: toadd=%s' % [value.inspect, toadd.inspect] toremove.each do |jndi| - destroyconn jndi + destroyconn jndi end toadd.each do |jndi| config = prepareconfig() @@ -79,23 +79,23 @@ def jndiname= value end exists? # Re read configuration end - + def classname getconnectionattr 'class-name' end - + def classname= value setconnectionattr 'class-name', value end - + def backgroundvalidation getconnectionattr 'background-validation' end - + def backgroundvalidation= value setconnectionattr 'background-validation', value end - + def security if Puppet_X::Coi::Jboss::Functions.jboss_to_bool(getconnectionattr 'security-application') return 'application' @@ -108,7 +108,7 @@ def security end return nil end - + def security= value if value == 'application' setconnectionattr 'security-application', true @@ -126,9 +126,9 @@ def security= value raise "Invalid value for security: #{value}. Supported values are: application, domain-and-application, domain" end end - + protected - + def createConnections if $data.nil? exists? # Re read configuration @@ -139,7 +139,7 @@ def createConnections end end end - + def connExists? jndi if $data['connection-definitions'].nil? $data['connection-definitions'] = {} @@ -156,7 +156,7 @@ def connExists? jndi end return res[:result] end - + def createconn jndi, config name = @resource[:name] connectionParams = makejbprops config @@ -164,19 +164,19 @@ def createconn jndi, config cmd = compilecmd "/subsystem=resource-adapters/resource-adapter=#{name}/connection-definitions=#{connectionName}:add(#{connectionParams})" bringUp "Resource adapter connection-definition", cmd end - + def destroyconn jndi name = @resource[:name] connectionName = escapeforjbname jndi cmd = compilecmd "/subsystem=resource-adapters/resource-adapter=#{name}/connection-definitions=#{connectionName}:remove()" bringDown "Resource adapter connection-definition", cmd end - + def prepareconfig params = { :basics => { 'archive' => @resource[:archive], - 'transaction-support' => @resource[:transactionsupport], + 'transaction-support' => @resource[:transactionsupport], }, :connections => {}, } @@ -206,15 +206,15 @@ def prepareconfig end return params end - + def escapeforjbname input input.gsub(/([^\\])\//, '\1\\/').gsub(/([^\\]):/, '\1\\:') end - + def unescapeforjbname input input.gsub(/\\\//, '/').gsub(/\\:/, ':') end - + def makejbprops input inp = {} input.each do |k, v| @@ -224,12 +224,12 @@ def makejbprops input end inp.inspect.gsub('=>', '=').gsub(/[\{\}]/, '').gsub(/\"([^\"]+)\"=/,'\1=') end - + def setbasicattr name, value setattribute "/subsystem=resource-adapters/resource-adapter=#{@resource[:name]}", name, value $data[name] = value end - + def setconnectionattr name, value prepareconfig()[:connections].each do |jndi, config| if not connExists? jndi @@ -246,7 +246,7 @@ def setconnectionattr name, value $data['connection-definitions'][jndi][name] = value end end - + def getconnectionattr name prepareconfig()[:connections].each do |jndi, config| if not connExists? jndi @@ -258,5 +258,5 @@ def getconnectionattr name return $data['connection-definitions'][jndi][name] end end - -end \ No newline at end of file + +end diff --git a/lib/puppet/provider/jboss_securitydomain/jbosscli.rb b/lib/puppet/provider/jboss_securitydomain/jbosscli.rb index 25a1270..4ecba57 100644 --- a/lib/puppet/provider/jboss_securitydomain/jbosscli.rb +++ b/lib/puppet/provider/jboss_securitydomain/jbosscli.rb @@ -1,67 +1,6 @@ -require File.expand_path(File.join(File.dirname(File.dirname(__FILE__)), 'jbosscli.rb')) +require File.expand_path(File.join(File.dirname(__FILE__), '../../../puppet_x/coi/jboss')) -Puppet::Type.type(:jboss_securitydomain).provide(:jbosscli, :parent => Puppet::Provider::Jbosscli) do - - def create - cmd = compilecmd "/subsystem=security/security-domain=#{@resource[:name]}/authentication=classic:add(login-modules=[{code=>\"#{@resource[:code]}\",flag=>\"#{@resource[:codeflag]}\",module-options=>[" - @resource[:moduleoptions].each_with_index do |(key, value), index| - val = value.to_s.gsub(/\n/, ' ').strip - cmd += '%s => "%s"' % [key, val] - if index == @resource[:moduleoptions].length - 1 - break - end - cmd += "," - end - cmd += "]}])" - cmd2 = compilecmd "/subsystem=security/security-domain=#{@resource[:name]}:add(cache-type=default)" - bringUp('Security Domain Cache Type', cmd2)[:result] - bringUp('Security Domain', cmd)[:result] - end - - def destroy - cmd = compilecmd "/subsystem=security/security-domain=#{@resource[:name]}:remove()" - bringDown('Security Domain', cmd)[:result] - end - - def preparelines lines - lines.gsub(/\((\"[^\"]+\") => (\"[^\"]+\")\)/, '\1 => \2').gsub(/\[((?:[\n\s]*\"[^\"]+\" => \"[^\"]+\",?[\n\s]*)+)\]/m, '{\1}') - end - - # - def exists? - cmd = compilecmd "/subsystem=security/security-domain=#{@resource[:name]}/authentication=classic:read-resource()" - res = executeWithoutRetry cmd - if not res[:result] - Puppet.debug "Security Domain does NOT exist" - return false - end - undefined = nil - lines = preparelines res[:lines] - data = eval(lines)['result'] - Puppet.debug "Security Domain exists: #{data.inspect}" - - existinghash = Hash.new - givenhash = Hash.new - - if !@resource[:moduleoptions].nil? - @resource[:moduleoptions].each do |key, value| - givenhash["#{key}"] = value.to_s.gsub(/\n/, ' ').strip - end - end - - data['login-modules'][0]['module-options'].each do |key, value| - existinghash[key.to_s] = value.to_s.gsub(/\n/, ' ').strip - end - - if !existinghash.nil? && !givenhash.nil? && existinghash != givenhash - diff = givenhash.to_a - existinghash.to_a - Puppet.notice "Security domain should be recreated. Diff: #{diff.inspect}" - Puppet.debug "Security domain moduleoptions existing hash => #{existinghash.inspect}" - Puppet.debug "Security domain moduleoptions given hash => #{givenhash.inspect}" - destroy - return false - end - return true - end - +Puppet::Type.type(:jboss_securitydomain).provide(:jbosscli, + :parent => Puppet_X::Coi::Jboss::Provider::AbstractJbossCli) do + include Puppet_X::Coi::Jboss::Provider::SecurityDomain end diff --git a/lib/puppet/type/jboss_confignode.rb b/lib/puppet/type/jboss_confignode.rb index 926704e..29daa8a 100644 --- a/lib/puppet/type/jboss_confignode.rb +++ b/lib/puppet/type/jboss_confignode.rb @@ -1,6 +1,9 @@ +require File.expand_path(File.join(File.dirname(__FILE__), '../../puppet_x/coi/jboss')) + Puppet::Type.newtype(:jboss_confignode) do + @doc = "Generic configuration entry for JBoss Application Sever" - + newproperty(:ensure) do desc "Whether a configuration node should be in one of `present`, `absent`, `running`, `stopped`, `disabled` or `enabled` state." @@ -9,37 +12,53 @@ aliasvalue(:true, :present) aliasvalue(:false, :absent) - end + end newparam(:name) do desc "The name of resource" end - + newparam(:path) do desc "The JBoss configuration path to be ensured" end - - newproperty(:properties) do + + newproperty(:properties) do desc "Additional properties for node" munge do |value| - unless value.respond_to? :[] - {} + if %w{absent undef}.include?(value) + value.to_sym else - value + matcher = Puppet_X::Coi::Jboss::BuildinsUtils::HashlikeMatcher.new(value) + unless matcher.hashlike? + {} + else + value + end end end - + def change_to_s(current, desire) + absentlike = Puppet_X::Coi::Jboss::Constants::ABSENTLIKE_WITH_S changes = [] - desire.each do |key, desired_value| - current_value = current[key] - message = "property '#{key}' has been changed from #{current_value.inspect} to #{desired_value.inspect}" - changes << message unless current_value == desired_value + keys = [] + keys.concat(desire.keys) unless absentlike.include?(desire) + keys.concat(current.keys) unless absentlike.include?(current) + keys.uniq.sort.each do |key| + desired_value = if absentlike.include?(desire) then desire else desire[key] end + current_value = if absentlike.include?(current) then current else current[key] end + if absentlike.include?(desired_value) and not absentlike.include?(current_value) then + message = "property '#{key}' was #{current_value.inspect} and has been removed" + elsif absentlike.include?(current_value) and not absentlike.include?(desired_value) + message = "property '#{key}' has been set to #{desired_value.inspect}" + else + message = "property '#{key}' has changed from #{current_value.inspect} to #{desired_value.inspect}" + end + changes << message unless current_value == desired_value end changes.join ', ' end end - + newparam(:profile) do desc "The JBoss profile name" defaultto "full" @@ -49,12 +68,12 @@ def change_to_s(current, desire) desc "Indicate that server is in domain mode" newvalues :true, :false defaultto :true - + munge do |val| val == :true or val == true end end - + newparam(:controller) do desc "Domain controller host:port address" validate do |value| @@ -63,7 +82,7 @@ def change_to_s(current, desire) end end end - + newparam :ctrluser do desc 'A user name to connect to controller' end @@ -81,6 +100,6 @@ def change_to_s(current, desire) desc "Retry timeout in seconds" defaultto 1 end - - -end \ No newline at end of file + + +end diff --git a/lib/puppet/type/jboss_datasource.rb b/lib/puppet/type/jboss_datasource.rb index 1bc8739..96c8844 100644 --- a/lib/puppet/type/jboss_datasource.rb +++ b/lib/puppet/type/jboss_datasource.rb @@ -1,4 +1,7 @@ +require File.expand_path(File.join(File.dirname(__FILE__), '../../puppet_x/coi/jboss')) + Puppet::Type.newtype(:jboss_datasource) do + @doc = "Data sources configuration for JBoss Application Sever" ensurable @@ -6,7 +9,7 @@ desc "Name of type resource" isnamevar end - + newproperty(:xa) do desc "Is it XA Datasource?" newvalues :true, :false @@ -15,15 +18,15 @@ value == :true or value == true end end - + newproperty(:dbname) do desc "The database's name" end - + newproperty(:jndiname) do desc "jndi-name" end - + newproperty(:jta) do desc "jta" newvalues :true, :false @@ -67,24 +70,28 @@ def change_to_s from, to newproperty(:options) do desc "Extra options for datasource or xa-datasource" - + validate do |value| - absentlike = [:absent, :undef, nil] - absentlike.concat(absentlike.map {|v| v.to_s}) - hashlike = (value.respond_to? :[] and value.respond_to? :each and not value.is_a? String and not value.is_a? Symbol) - unless absentlike.include?(value) or hashlike + matcher = Puppet_X::Coi::Jboss::BuildinsUtils::HashlikeMatcher.new(value) + unless Puppet_X::Coi::Jboss::Constants::ABSENTLIKE_WITH_S.include?(value) or matcher.hashlike? fail "You can pass only hash-like objects or absent and undef values, given #{value.inspect}" end end munge do |value| - if %w{absent undef}.include?(value) then value.to_sym else value end + matcher = Puppet_X::Coi::Jboss::BuildinsUtils::HashlikeMatcher.new(value) + ret = if %w{absent undef}.include?(value) then value.to_sym else value end + if matcher.hashlike? + value.each do |k, v| + ret[k] = Puppet_X::Coi::Jboss::Constants::ABSENTLIKE_WITH_S.include?(v) ? nil : v + end + end + ret end def change_to_s(current, desire) + absentlike = Puppet_X::Coi::Jboss::Constants::ABSENTLIKE_WITH_S changes = [] - absentlike = [:absent, :undef, nil] - absentlike.concat(absentlike.map {|v| v.to_s}) keys = [] keys.concat(desire.keys) unless absentlike.include?(desire) keys.concat(current.keys) unless absentlike.include?(current) @@ -103,7 +110,7 @@ def change_to_s(current, desire) changes.join ', ' end end - + newproperty(:enabled) do desc "Is datasource enabled?" newvalues :true, :false @@ -124,7 +131,7 @@ def change_to_s(current, desire) end end end - + newproperty(:port) do desc "port to connect" isrequired @@ -132,12 +139,12 @@ def change_to_s(current, desire) unless value == '' or /^\d+$/.match(value.to_s) raise ArgumentError, "Datasource port is invalid, given #{value.inspect}" end - end + end munge do |value| - if value == '' then 0 else Integer(value) end + if value == '' then 0 else Integer(value) end end end - + newproperty(:jdbcscheme) do desc "jdbcscheme to be used" isrequired @@ -152,7 +159,7 @@ def change_to_s(current, desire) desc "Indicate that server is in domain mode" defaultto true end - + newparam(:controller) do desc "Domain controller host:port address" # Default is set to support listing of datasources without parameters (for easy use) @@ -163,7 +170,7 @@ def change_to_s(current, desire) end end end - + newparam :ctrluser do desc 'A user name to connect to controller' end @@ -183,4 +190,3 @@ def change_to_s(current, desire) end end - diff --git a/lib/puppet/type/jboss_jmsqueue.rb b/lib/puppet/type/jboss_jmsqueue.rb index 030f9ed..709fe5e 100644 --- a/lib/puppet/type/jboss_jmsqueue.rb +++ b/lib/puppet/type/jboss_jmsqueue.rb @@ -9,7 +9,7 @@ newproperty(:entries, :array_matching => :all) do desc "entries passed as array" - + def is_to_s is return is.inspect end @@ -23,7 +23,7 @@ def should_to_s should defaultto false desc "durable true/false" end - + newparam(:profile) do desc "The JBoss profile name" defaultto "full" @@ -33,7 +33,7 @@ def should_to_s should desc "Indicate that server is in domain mode" defaultto true end - + newparam(:controller) do desc "Domain controller host:port address" validate do |value| @@ -42,7 +42,7 @@ def should_to_s should end end end - + newparam :ctrluser do desc 'A user name to connect to controller' end diff --git a/lib/puppet_x/coi/jboss.rb b/lib/puppet_x/coi/jboss.rb new file mode 100644 index 0000000..2124137 --- /dev/null +++ b/lib/puppet_x/coi/jboss.rb @@ -0,0 +1,52 @@ +# A puppet x module +module Puppet_X + # A COI puppet_x module + module Coi + # Require relative kernel-like method + def self.require_relative(relative_path, lvl = 0) + stack = Kernel.caller + file = stack[lvl].split(/:\d/,2).first + file = './' if ['(eval)', '(pry)', ''].include?(file) + file = File.dirname(file) + path = File.expand_path(File.join(file, relative_path)) + Kernel.require(path) + end + + # JBoss module + module Jboss + # JBoss provider module + module Provider + + end + end + end +end + +# Ruby default kernel module +module Kernel + define_method(:require_relative) { |rel| Puppet_X::Coi::require_relative(rel, lvl = 1) } unless Kernel.respond_to? :require_relative +end + +require_relative 'jboss/constants' +require_relative 'jboss/buildins_utils' +require_relative 'jboss/configuration' +require_relative 'jboss/facts' + +require_relative 'jboss/functions/jboss_basename' +require_relative 'jboss/functions/jboss_dirname' +require_relative 'jboss/functions/jboss_short_version' +require_relative 'jboss/functions/jboss_to_bool' +require_relative 'jboss/functions/jboss_to_i' +require_relative 'jboss/functions/jboss_to_s' +require_relative 'jboss/functions/jboss_type_version' + +require_relative 'jboss/provider/abstract_jboss_cli' +require_relative 'jboss/provider/datasource' +require_relative 'jboss/provider/datasource/post_wildfly_provider' +require_relative 'jboss/provider/datasource/pre_wildfly_provider' +require_relative 'jboss/provider/datasource/static' +require_relative 'jboss/provider/confignode' +require_relative 'jboss/provider/deploy' +require_relative 'jboss/provider/securitydomain' +require_relative 'jboss/provider/jmsqueue' +require_relative 'jboss/provider/jdbcdriver' diff --git a/lib/puppet_x/coi/jboss/buildins_utils.rb b/lib/puppet_x/coi/jboss/buildins_utils.rb new file mode 100644 index 0000000..b2551e0 --- /dev/null +++ b/lib/puppet_x/coi/jboss/buildins_utils.rb @@ -0,0 +1,53 @@ +# This module contains vaious utility functions for Ruby buildins types +module Puppet_X::Coi::Jboss::BuildinsUtils + # Matcher for hash-like objects + class HashlikeMatcher + # Constructor + # @param {Object} target to be tested + def initialize(target) + @target = target + end + # Method returns true if passed object is a hashlike object, but not String or Symbol + def hashlike? + @target.respond_to? :[] and @target.respond_to? :each and not @target.is_a? String and not @target.is_a? Symbol + end + end + + # Matcher for blank objects (empty collections or false objects) + class BlankMatcher + # Constructor + # @param {Object} target to be tested + def initialize(target) + @target = target + end + # Method returns true if passed object is a hashlike object, but not String or Symbol + def blank? + return true if @target.nil? + @target.respond_to?(:empty?) ? @target.empty? : !@target + end + end + + # Thsi class handles convertion from various types to boolean + class ToBooleanConverter + # Constructor + # @param {Object} target to be converted + def initialize(target) + @target = target + end + # Converts given value to boolean value + def to_bool + if @target.respond_to?(:empty?) + str = @target + else + str = @target.to_s + end + if @target.is_a? Numeric + return @target != 0 + end + return true if @target == true || str =~ (/(true|t|yes|y)$/i) + bm = BlankMatcher.new(@target) + return false if @target == false || bm.blank? || str =~ (/(false|f|no|n)$/i) + raise ArgumentError.new("invalid value for Boolean: \"#{@target}\"") + end + end +end diff --git a/lib/puppet_x/coi/jboss/configuration.rb b/lib/puppet_x/coi/jboss/configuration.rb index 0f537af..2fc0456 100644 --- a/lib/puppet_x/coi/jboss/configuration.rb +++ b/lib/puppet_x/coi/jboss/configuration.rb @@ -1,15 +1,14 @@ -# A puppet x module -module Puppet_X -# A COI puppet_x module -module Coi -# JBoss module -module Jboss # A class for JBoss configuration -class Configuration +class Puppet_X::Coi::Jboss::Configuration class << self - + @config = nil + # Test method that return current version(for comatability with ruby 1.8) + def ruby_version + RUBY_VERSION + end + # Gets the main config file def configfile content = self.read_raw_profile_d.chomp @@ -65,7 +64,7 @@ def reset_config(value = nil) @config = value nil end - + # Gets configuration value by its symbol # # @param key [Symbol] a key in hash @@ -87,7 +86,3 @@ def read_raw_profile_d end end - -end -end -end \ No newline at end of file diff --git a/lib/puppet_x/coi/jboss/constants.rb b/lib/puppet_x/coi/jboss/constants.rb new file mode 100644 index 0000000..c63bac9 --- /dev/null +++ b/lib/puppet_x/coi/jboss/constants.rb @@ -0,0 +1,9 @@ +# Constants for COI's JBoss module +module Puppet_X::Coi::Jboss::Constants + ABSENTLIKE = [:absent, :undef, nil].freeze + ABSENTLIKE_WITH_S = (Proc.new do + # Proc scope not to leave any helper variables inside the context + stringified = ABSENTLIKE.reject { |v| v.nil? }.map { |v| v.to_s } + (ABSENTLIKE + stringified).freeze + end).call +end diff --git a/lib/puppet_x/coi/jboss/facts.rb b/lib/puppet_x/coi/jboss/facts.rb new file mode 100644 index 0000000..509c101 --- /dev/null +++ b/lib/puppet_x/coi/jboss/facts.rb @@ -0,0 +1,28 @@ +require_relative 'configuration' + +# A class for JBoss facts +class Puppet_X::Coi::Jboss::Facts + class << self + def define_fullconfig_fact + config = Puppet_X::Coi::Jboss::Configuration::read + unless config.nil? + config.each do |key, value| + fact_symbol = "jboss_#{key}".to_sym + Facter.add(fact_symbol) do + setcode { value } + end + end + Facter.add(:jboss_fullconfig) do + setcode do + if Puppet_X::Coi::Jboss::Configuration.ruby_version < '1.9.0' + class << config + define_method(:to_s, proc { self.inspect }) + end + end + config + end + end + end + end + end +end diff --git a/lib/puppet_x/coi/jboss/functions/jboss_basename.rb b/lib/puppet_x/coi/jboss/functions/jboss_basename.rb new file mode 100644 index 0000000..e93f876 --- /dev/null +++ b/lib/puppet_x/coi/jboss/functions/jboss_basename.rb @@ -0,0 +1,19 @@ +# A custom class that holds custom functions +class Puppet_X::Coi::Jboss::Functions + + class << self + # PRIVATE INTERNAL FUNCTION. Returns the last component of the filename given in file_name + # + # @param args [Array] should be only one argument in array + # @return [string|string[]] the file name(s) + def jboss_basename args + raise(Puppet::ParseError, "jboss_basename(): Wrong numbers of arguments given (#{args.size} for 1)") if args.size != 1 + input = args[0] + if input.is_a?(Array) + input.collect do |a| File.basename(a) end + else + File.basename(input) + end + end + end +end diff --git a/lib/puppet_x/coi/jboss/functions/jboss_dirname.rb b/lib/puppet_x/coi/jboss/functions/jboss_dirname.rb new file mode 100644 index 0000000..355526d --- /dev/null +++ b/lib/puppet_x/coi/jboss/functions/jboss_dirname.rb @@ -0,0 +1,18 @@ +# A custom class that holds custom functions +class Puppet_X::Coi::Jboss::Functions + + class << self + # PRIVATE INTERNAL FUNCTION. Returns the forst component of the filename given in file_name + # + # @param args [Array] should be only one argument in array + # @return [string|string[]] the file path(s) + def jboss_dirname args + raise(Puppet::ParseError, "jboss_dirname(): Wrong numbers of arguments given (#{args.size} for 1)") if args.size != 1 + if args[0].is_a?(Array) + args[0].collect do |a| File.dirname(a) end + else + File.dirname(args[0]) + end + end + end +end diff --git a/lib/puppet_x/coi/jboss/functions/jboss_short_version.rb b/lib/puppet_x/coi/jboss/functions/jboss_short_version.rb new file mode 100644 index 0000000..3566a6f --- /dev/null +++ b/lib/puppet_x/coi/jboss/functions/jboss_short_version.rb @@ -0,0 +1,18 @@ +# A custom class that holds custom functions +class Puppet_X::Coi::Jboss::Functions + + class << self + # PRIVATE INTERNAL FUNCTION. Return the version of application server + # + # @param args [Array] should be only one argument in array + # @return [string|string[]] the application server name(s) + def jboss_short_version args + raise(Puppet::ParseError, "jboss_short_version(): Wrong number of arguments given (#{args.size} for 1)") if args.size != 1 + + version = args[0] + re = /^(?:[a-z]+-)?(\d+\.\d+)\.\d+(?:\.[A-Za-z]+)?$/ + m = re.match(version) + if m then m[1] else nil end + end + end +end diff --git a/lib/puppet_x/coi/jboss/functions/jboss_to_bool.rb b/lib/puppet_x/coi/jboss/functions/jboss_to_bool.rb index 7611d76..490cd52 100644 --- a/lib/puppet_x/coi/jboss/functions/jboss_to_bool.rb +++ b/lib/puppet_x/coi/jboss/functions/jboss_to_bool.rb @@ -1,11 +1,5 @@ -# A puppet x module -module Puppet_X -# A COI puppet_x module -module Coi -# JBoss module -module Jboss # A custom class that holds custom functions -class Functions +class Puppet_X::Coi::Jboss::Functions class << self # PRIVATE INTERNAL FUNCTION. Casts any value to boolean @@ -22,8 +16,8 @@ def jboss_to_bool args return string end string = string.to_s if string.is_a?(Symbol) - string = string.inspect unless string.is_a?(String) - + string = string.inspect unless string.is_a?(String) + # We consider all the yes, no, y, n and so on too ... result = case string # @@ -37,11 +31,8 @@ def jboss_to_bool args else false end - + return result end end end -end -end -end \ No newline at end of file diff --git a/lib/puppet_x/coi/jboss/functions/jboss_to_i.rb b/lib/puppet_x/coi/jboss/functions/jboss_to_i.rb index f2f168a..b7ff51a 100644 --- a/lib/puppet_x/coi/jboss/functions/jboss_to_i.rb +++ b/lib/puppet_x/coi/jboss/functions/jboss_to_i.rb @@ -1,11 +1,5 @@ -# A puppet x module -module Puppet_X -# A COI puppet_x module -module Coi -# JBoss module -module Jboss # A custom class that holds custom functions -class Functions +class Puppet_X::Coi::Jboss::Functions class << self # PRIVATE INTERNAL FUNCTION. Casts any value to integer @@ -20,6 +14,3 @@ def jboss_to_i args end end end -end -end -end \ No newline at end of file diff --git a/lib/puppet_x/coi/jboss/functions/jboss_to_s.rb b/lib/puppet_x/coi/jboss/functions/jboss_to_s.rb index d627eb8..01ac98c 100644 --- a/lib/puppet_x/coi/jboss/functions/jboss_to_s.rb +++ b/lib/puppet_x/coi/jboss/functions/jboss_to_s.rb @@ -1,11 +1,5 @@ -# A puppet x module -module Puppet_X -# A COI puppet_x module -module Coi -# JBoss module -module Jboss # A custom class that holds custom functions -class Functions +class Puppet_X::Coi::Jboss::Functions class << self # PRIVATE INTERNAL FUNCTION. Casts any value to string @@ -20,6 +14,3 @@ def jboss_to_s args end end end -end -end -end \ No newline at end of file diff --git a/lib/puppet_x/coi/jboss/functions/jboss_type_version.rb b/lib/puppet_x/coi/jboss/functions/jboss_type_version.rb new file mode 100644 index 0000000..8f676f9 --- /dev/null +++ b/lib/puppet_x/coi/jboss/functions/jboss_type_version.rb @@ -0,0 +1,17 @@ +# A custom class that holds custom functions +class Puppet_X::Coi::Jboss::Functions + + class << self + # PRIVATE INTERNAL FUNCTION. Return type of application server given as input + # + # @param args [Array] should be only one argument in array + # @return [string|string[]] the application server name + def jboss_type_version args + raise(Puppet::ParseError, "jboss_type_version(): Given invalid number of parameters(#{args.size} instead of 1)") if args.size != 1 + version = args[0] + re = /^([a-z]+)-(?:\d+\.\d+)\.\d+(?:\.[A-Za-z]+)?$/ + m = re.match(version) + if m then m[1] else nil end + end + end +end diff --git a/lib/puppet/provider/jbosscli.rb b/lib/puppet_x/coi/jboss/provider/abstract_jboss_cli.rb similarity index 78% rename from lib/puppet/provider/jbosscli.rb rename to lib/puppet_x/coi/jboss/provider/abstract_jboss_cli.rb index 310e296..5d6efa2 100644 --- a/lib/puppet/provider/jbosscli.rb +++ b/lib/puppet_x/coi/jboss/provider/abstract_jboss_cli.rb @@ -1,40 +1,9 @@ # -*- coding: utf-8 -*- -require File.expand_path(File.join(File.dirname(__FILE__), '../../puppet_x/coi/jboss/configuration')) +require_relative '../configuration' require 'tempfile' -class Object - def blank? - return true if self.nil? - self.respond_to?(:empty?) ? self.empty? : !self - end - - def to_bool - if self.respond_to?(:empty?) - str = self - else - str = self.to_s - end - if self.is_a? Numeric - return self != 0 - end - return true if self == true || str =~ (/(true|t|yes|y)$/i) - return false if self == false || self.blank? || str =~ (/(false|f|no|n)$/i) - raise ArgumentError.new("invalid value for Boolean: \"#{self}\"") - end -end -class Hash - def hashbackmap - result = {} - - self.each do |key, val| - result[key] = yield val - end - - result - end -end - -class Puppet::Provider::Jbosscli < Puppet::Provider +# Base class for all JBoss providers +class Puppet_X::Coi::Jboss::Provider::AbstractJbossCli < Puppet::Provider @@bin = "bin/jboss-cli.sh" @@contents = nil @@ -45,23 +14,23 @@ def jbossclibin path = "#{home}/#{@@bin}" return path end - + def jbosshome Puppet_X::Coi::Jboss::Configuration::config_value :home end - + def jbosslog Puppet_X::Coi::Jboss::Configuration::config_value :console_log end - + def config_runasdomain Puppet_X::Coi::Jboss::Configuration::config_value :runasdomain end - + def config_controller Puppet_X::Coi::Jboss::Configuration::config_value :controller end - + def config_profile Puppet_X::Coi::Jboss::Configuration::config_value :profile end @@ -69,35 +38,35 @@ def config_profile end # TODO: Uncomment for defered provider confinment after droping support for Puppet < 3.0 - # commands :jbosscli => Puppet::Provider::Jbosscli.jbossclibin + # commands :jbosscli => Puppet_X::Coi::Jboss::Provider::AbstractJbossCli.jbossclibin def runasdomain? @resource[:runasdomain] end - + def getlog(lines) last_lines = `tail -n #{lines} #{jbosslog}` end - + def printlog(lines) - return " ---\n JBoss AS log (last #{lines} lines): \n#{getlog lines}" + return " ---\n JBoss AS log (last #{lines} lines): \n#{getlog lines}" end def execute jbosscmd retry_count = @resource[:retry] retry_timeout = @resource[:retry_timeout] - ctrlcfg = Puppet::Provider::Jbosscli.controllerConfig @resource - return Puppet::Provider::Jbosscli.execute jbosscmd, runasdomain?, ctrlcfg, retry_count, retry_timeout + ctrlcfg = Puppet_X::Coi::Jboss::Provider::AbstractJbossCli.controllerConfig @resource + return Puppet_X::Coi::Jboss::Provider::AbstractJbossCli.execute jbosscmd, runasdomain?, ctrlcfg, retry_count, retry_timeout end def executeWithoutRetry jbosscmd - ctrlcfg = Puppet::Provider::Jbosscli.controllerConfig @resource - return Puppet::Provider::Jbosscli.execute jbosscmd, runasdomain?, ctrlcfg, 0, 0 + ctrlcfg = Puppet_X::Coi::Jboss::Provider::AbstractJbossCli.controllerConfig @resource + return Puppet_X::Coi::Jboss::Provider::AbstractJbossCli.execute jbosscmd, runasdomain?, ctrlcfg, 0, 0 end def executeAndGet jbosscmd - ctrlcfg = Puppet::Provider::Jbosscli.controllerConfig @resource - return Puppet::Provider::Jbosscli.executeAndGet jbosscmd, runasdomain?, ctrlcfg, 0, 0 + ctrlcfg = Puppet_X::Coi::Jboss::Provider::AbstractJbossCli.controllerConfig @resource + return Puppet_X::Coi::Jboss::Provider::AbstractJbossCli.executeAndGet jbosscmd, runasdomain?, ctrlcfg, 0, 0 end def self.controllerConfig resource @@ -108,19 +77,19 @@ def self.controllerConfig resource } return conf end - + def self.last_execute_status $? end - + def self.execshell(cmd) `#{cmd}` end - + def self.jbossas? Facter.value(:jboss_product) == 'jboss-as' end - + def self.timeout_cli '--timeout=50000' unless jbossas? end @@ -142,12 +111,12 @@ def self.execute jbosscmd, runasdomain, ctrlcfg, retry_count, retry_timeout ENV['__PASSWD'] = ctrlcfg[:ctrlpasswd] cmd += " --password=$__PASSWD" end - + retries = 0 result = '' lines = '' begin - if retries > 0 + if retries > 0 Puppet.warning "JBoss CLI command failed, try #{retries}/#{retry_count}, last status: #{result.exitstatus.to_s}, message: #{lines}" sleep retry_timeout.to_i end @@ -165,12 +134,12 @@ def self.execute jbosscmd, runasdomain, ctrlcfg, retry_count, retry_timeout :lines => lines } end - + def setattribute(path, name, value) escaped = value.nil? ? nil : escape(value) setattribute_raw(path, name, escaped) end - + def setattribute_raw(path, name, value) Puppet.debug "#{name.inspect} setting to #{value.inspect} for path: #{path}" if value.nil? @@ -188,29 +157,29 @@ def setattribute_raw(path, name, value) end @property_hash[name] = value end - + def bringUp(typename, args) return executeWithFail(typename, args, 'to create') end - + def bringDown(typename, args) return executeWithFail(typename, args, 'to remove') end - + $add_log = nil - + def isprintinglog=(setting) $add_log = setting end - + def trace method Puppet.debug '%s[%s] > IN > %s' % [self.class, @resource[:name], method] end - + def traceout method, retval Puppet.debug '%s[%s] > OUT > %s: %s' % [self.class, @resource[:name], method, retval.inspect] end - + def self.escape value if value.respond_to? :to_str str = value.gsub(/([^\\])\"/, '\1\\"') @@ -219,30 +188,31 @@ def self.escape value end return str.inspect end - + def escape value - Puppet::Provider::Jbosscli.escape(value) + Puppet_X::Coi::Jboss::Provider::AbstractJbossCli.escape(value) end - + def executeWithFail(typename, passed_args, way) executed = execute(passed_args) if not executed[:result] ex = "\n#{typename} failed #{way}:\n[CLI command]: #{executed[:cmd]}\n[Error message]: #{executed[:lines]}" if not $add_log.nil? and $add_log > 0 ex = "#{ex}\n#{printlog $add_log}" - end + end raise ex end return executed end - + def compilecmd cmd - Puppet::Provider::Jbosscli.compilecmd @resource[:runasdomain], @resource[:profile], cmd + Puppet_X::Coi::Jboss::Provider::AbstractJbossCli.compilecmd @resource[:runasdomain], @resource[:profile], cmd end - + def self.compilecmd runasdomain, profile, cmd out = cmd.to_s - asdomain = runasdomain.to_bool + convr = Puppet_X::Coi::Jboss::BuildinsUtils::ToBooleanConverter.new(runasdomain) + asdomain = convr.to_bool if asdomain && out[0..9] == '/subsystem' out = "/profile=#{profile}#{out}" end @@ -277,6 +247,5 @@ def self.executeAndGet cmd, runasdomain, ctrlcfg, retry_count, retry_timeout } end end - end diff --git a/lib/puppet_x/coi/jboss/provider/confignode.rb b/lib/puppet_x/coi/jboss/provider/confignode.rb new file mode 100644 index 0000000..1365477 --- /dev/null +++ b/lib/puppet_x/coi/jboss/provider/confignode.rb @@ -0,0 +1,259 @@ +# A module for ConfigNode +module Puppet_X::Coi::Jboss::Provider::ConfigNode + + def create + trace 'create' + if exists? + return + end + ret = bringUp 'Configuration node', "#{compiledpath}:add(#{compileprops})" + invalidate + return ret + end + + def destroy + trace 'destroy' + if not exists? + return + end + if status == :running + doStop + end + ret = bringDown 'Configuration node', "#{compiledpath}:remove()" + invalidate + return ret + end + + def exists? + trace 'exists?' + if @clean + return (not @data.nil?) + end + # TODO: This line is probably useless, resource path cannot be nil (at lesat when creating type with Puppet::Type.type(:jboss_confignode).new(raw) ) + @resource[:path] = @resource[:name] if @resource[:path].nil? + @resource[:properties] = {} if @resource[:properties].nil? + @resource[:properties].each do |key, value| + if value == "undef" or value == :undef + @resource[:properties][key] = nil + end + end + + res = executeAndGet "#{compiledpath}:read-resource(include-runtime=true, include-defaults=false)" + if res[:result] + @data = {} + res[:data].each do |key, value| + props = @resource[:properties] + @data[key] = value + if not @property_hash.key? :properties + @property_hash[:properties] = {} + end + if props.key? key + @property_hash[:properties][key] = value + end + end + @clean = true + traceout 'status()', true + return true + end + @clean = true + @data = nil + traceout 'status()', false + return false + end + + def status + trace 'status' + meth = self.method 'ensure' + ret = meth.call + traceout 'status()', ret + return ret + end + + def ensure + trace 'ensure' + + exists? + if @data.nil? + @property_hash[:ensure] = :absent + traceout 'ensure()', :absent + return :absent + end + if not @data['status'].nil? + st = @data['status'].upcase + if st == 'DISABLED' + @property_hash[:ensure] = :disabled + traceout 'ensure()', :disabled + return :disabled + end + if ['RUNNING', 'STARTED'].include? st + @property_hash[:ensure] = :running + traceout 'ensure()', :running + return :running + else + @property_hash[:ensure] = :stopped + traceout 'ensure()', :stopped + return :stopped + end + end + if not @data['enabled'].nil? + if @data['enabled'] + @property_hash[:ensure] = :enabled + traceout 'ensure()', :enabled + return :enabled + else + @property_hash[:ensure] = :disabled + traceout 'ensure()', :disabled + return :disabled + end + end + if @data.length > 0 + @property_hash[:ensure] = :present + traceout 'ensure()', :present + return :present + end + end + + def ensure= value + trace 'ensure=(%s)' % [ value.inspect ] + case value + when :present then create + when :absent then destroy + when :running then doStart + when :stopped then doStop + when :enabled then doEnable + when :disabled then doDisable + end + traceout 'ensure=(%s)' % value.inspect, value.inspect + return value + end + + def properties + trace 'properties()' + + if @data.nil? + traceout 'properties()', {} + return {} + else + hash = {} + @property_hash[:properties] = {} if @property_hash[:properties].nil? + @property_hash[:properties].each do |k, v| + if v.nil? or !!v == v or v.is_a? Numeric or v.is_a? Hash or v.is_a? Array + hash[k.to_s] = v + else + hash[k.to_s] = v.to_s + end + end + traceout 'properties()', hash + return hash + end + end + + def properties= newprops + trace 'properties=(%s)' % newprops.inspect + + # Sorting by value to process `nil` values first + sorted = newprops.sort do |a, b| + if a[1] == b[1] + 0 + elsif a[1].nil? and not b[1].nil? + -1 + elsif not a[1].nil? and b[1].nil? + 1 + else + 0 + end + end + sorted.each do |arr| + key, value = arr + if not @data.key? key or @data[key] != value + writekey key, value + Puppet.notice "JBoss::Property: Key `#{key}` with value `#{value.inspect}` for path `#{compiledpath}` has been set." + end + end + end + + private + + def doStart + trace 'doStart' + + if status == :absent + create + end + ret = bringUp 'Configuration node START', "#{compiledpath}:start(blocking=true)" + invalidate + traceout 'doStart', ret + return ret + end + + def doStop + trace 'doStop' + + if status == :absent + create + end + ret = bringDown 'Configuration node STOP', "#{compiledpath}:stop(blocking=true)" + invalidate + return ret + end + + def doEnable + trace 'doEnable' + + if status == :absent + create + end + ret = bringUp 'Configuration node ENABLE', "#{compiledpath}:enable()" + invalidate + return ret + end + + def doDisable + trace 'doDisable' + + if status == :absent + create + end + ret = bringDown 'Configuration node DISABLE', "#{compiledpath}:disable()" + invalidate + return ret + end + + def invalidate + trace 'invalidate' + + @clean = false + end + + def writekey key, value + trace 'writekey(%s,%s)' % [key.inspect, value.inspect] + + invalidate + if value.nil? + bringDown 'Configuration node property', "#{compiledpath}:undefine-attribute(name=#{key})" + else + preparedval = escape value + bringUp 'Configuration node property', "#{compiledpath}:write-attribute(name=#{key}, value=#{preparedval})" + end + end + + def compiledpath + trace 'compiledpath' + + path = @resource[:path] + cmd = compilecmd path + end + + def compileprops + trace 'compileprops' + + props = @resource[:properties] + Puppet.debug("Properties to be compiled: #{props.inspect}") + arr = [] + props.reject { |k,v| v.nil? }.each do |key, value| + preparedval = escape value + arr.push "#{key}=#{preparedval}" + end + arr.join ', ' + end +end diff --git a/lib/puppet_x/coi/jboss/provider/datasource.rb b/lib/puppet_x/coi/jboss/provider/datasource.rb new file mode 100644 index 0000000..b05088c --- /dev/null +++ b/lib/puppet_x/coi/jboss/provider/datasource.rb @@ -0,0 +1,514 @@ +require_relative '../configuration' + +# A class for JBoss datasource provider +module Puppet_X::Coi::Jboss::Provider::Datasource + include Puppet_X::Coi::Jboss::Constants + include Puppet_X::Coi::Jboss::BuildinsUtils + def create + cmd = [ "#{create_delete_cmd} add --name=#{@resource[:name]}" ] + jta_opt(cmd) + cmd.push "--jndi-name=#{@resource[:jndiname].inspect}" + cmd.push "--driver-name=#{@resource[:drivername].inspect}" + cmd.push "--min-pool-size=#{@resource[:minpoolsize].inspect}" + cmd.push "--max-pool-size=#{@resource[:maxpoolsize].inspect}" + cmd.push "--user-name=#{@resource[:username].inspect}" + cmd.push "--password=#{@resource[:password].inspect}" + if @resource[:xa] + xa_properties = xa_datasource_properties_wrapper(createXaProperties) + cmd.push "--xa-datasource-properties=#{xa_properties}" + else + cmd.push "--connection-url=#{connectionUrl.inspect}" + end + @resource[:options].each do |attribute, value| + cmd.push "--#{attribute}=#{value.inspect}" + end + + bringUp 'Datasource', cmd.join(' ') + setenabled true + end + + def destroy + cmd = "#{create_delete_cmd} remove --name=#{@resource[:name]}" + bringDown 'Datasource', cmd + end + + + + def setenabled setting + Puppet.debug "setenabled #{setting.inspect}" + cmd = compilecmd "#{datasource_path}:read-attribute(name=enabled)" + res = executeAndGet cmd + enabled = res[:data] + Puppet.debug "Enabling datasource #{@resource[:name]} = #{enabled}: #{setting}" + if enabled != setting + if setting + cmd = compilecmd "#{datasource_path}:enable(persistent=true)" + else + cmd = compilecmd "#{datasource_path}:disable(persistent=true)" + end + bringUp "Datasource enable set to #{setting.to_s}", cmd + end + end + + def prepare_resource + if @resource.nil? + @resource = {} + end + if @resource[:name].nil? + @resource[:name] = @property_hash[:name] + end + if @resource[:controller].nil? + @resource[:controller] = controller + end + if @resource[:runasdomain].nil? + @resource[:runasdomain] = runasdomain + end + if @resource[:profile].nil? + @resource[:profile] = profile + end + if @resource[:xa].nil? + @resource[:xa] = xa + end + end + + def exists? + prepare_resource + if @resource[:dbname].nil? + @resource[:dbname] = @resource[:name] + end + @data = nil + cmd = compilecmd "#{datasource_path}:read-resource(recursive=true)" + res = executeAndGet cmd + if(res[:result] == false) + Puppet.debug "Datasorce (xa: #{xa?}) `#{@resource[:name]}` does NOT exist" + return false + end + Puppet.debug "Datasorce (xa: #{xa?}) `#{@resource[:name]}` exists: #{res[:data].inspect}" + @data = res[:data] + return true + end + + def name + @property_hash[:name] + end + + def getproperty name, default=nil + if @property_hash.nil? or (@property_hash.respond_to? :key? and not @property_hash.key? name) or @property_hash[name].nil? + return default + end + return @property_hash[name] + end + def xa + setting = getproperty :xa, nil + if not setting.nil? + return setting + else + return xa? + end + end + def xa= value + actual = getproperty :xa, false + if actual.to_s != value.to_s + destroy + create + end + end + def controller + getproperty :controller + end + def profile + getproperty :profile, default_profile + end + def runasdomain + getproperty :runasdomain + end + + def jndiname + getattrib 'jndi-name' + end + + def jndiname= value + setattrib 'jndi-name', value + end + + def drivername + getattrib 'driver-name' + end + + def drivername= value + setattrib 'driver-name', value + end + + def minpoolsize + getattrib('min-pool-size').to_s + end + + def minpoolsize= value + setattrib 'min-pool-size', value + end + + def maxpoolsize + getattrib('max-pool-size').to_s + end + + def maxpoolsize= value + setattrib 'max-pool-size', value + end + + def username + getattrib('user-name') + end + + def username= value + setattrib 'user-name', value + end + + def password + getattrib('password') + end + + def password= value + setattrib 'password', value + end + + def options + managed_fetched_options + end + + def options= value + managed_fetched_options.each do |key, fetched_value| + if ABSENTLIKE.include?(value) + expected_value = nil + else + expected_value = value[key] + end + if expected_value != fetched_value + setattrib(key, expected_value) + end + end + end + + def enabled + getattrib('enabled').to_s + end + + def enabled= value + Puppet.debug "Enabling datasource #{@resource[:name]} to #{value}" + setenabled value + end + + def jdbcscheme + connectionHash()[:Scheme] + end + + def jdbcscheme= value + writeConnection :Scheme, value + end + + def host + connectionHash()[:ServerName].to_s + end + + def host= value + writeConnection :ServerName, value + end + + def port + connectionHash()[:PortNumber].to_i + end + + def port= value + writeConnection :PortNumber, value + end + + def dbname + connectionHash()[:DatabaseName] + end + + def dbname= value + writeConnection :DatabaseName, value + end + + def getattrib name, default=nil + if not @readed + exists? + @readed = true + end + if not @data.nil? and @data.key? name + return @data[name] + end + return default + end + + def setattrib name, value + setattribute datasource_path, name, value + @data[name] = value + end + + def jta + provider_impl.jta + end + + def jta= value + provider_impl.jta = value + end + + def xa? + if not @resource[:xa].nil? + return @resource[:xa] + else + return false + end + end + + def xa_datasource_properties_wrapper(parameters) + provider_impl.xa_datasource_properties_wrapper(parameters) + end + + def jta_opt(cmd) + provider_impl.jta_opt(cmd) + end + + protected + + def default_profile + 'full' + end + + private + + def provider_impl + require_relative 'datasource/pre_wildfly_provider' + require_relative 'datasource/post_wildfly_provider' + + if @impl.nil? + if Puppet_X::Coi::Jboss::Configuration::is_pre_wildfly? + @impl = Puppet_X::Coi::Jboss::Provider::Datasource::PreWildFlyProvider.new(self) + else + @impl = Puppet_X::Coi::Jboss::Provider::Datasource::PostWildFlyProvider.new(self) + end + end + @impl + end + + def managed_fetched_options + fetched = {} + @resource[:options].each do |k, v| + fetched[k] = getattrib(k) + end + fetched + end + + def createXaProperties + if @resource[:drivername] == 'h2' + "URL=#{connectionUrl.inspect}" + else + out = [] + props = [:ServerName, :PortNumber, :DatabaseName] + props.each do |prop| + value = @resource[getPuppetKey prop] + out.push "#{prop.to_s}=#{value.inspect}" + end + if oracle? + out.push 'DriverType="thin"' + end + out.join ',' + end + end + + def writeConnection property, value + if xa? + if h2? + writeXaProperty 'URL', connectionUrl + else + writeXaProperty property, value + end + else + readed = getattrib('connection-url') + url = connectionUrl + if readed.nil? or readed != url + setattrib 'connection-url', url + end + end + end + + def getPuppetKey property + case property + when :Scheme + return :jdbcscheme + when :ServerName + return :host + when :PortNumber + return :port + when :DatabaseName + return :dbname + else + raise 'Unknown property: ' + property + end + end + + def writeXaProperty property, value + if property == :Scheme + getattrib('xa-datasource-properties')[property.to_s]['value'] = value + return + end + cmd = compilecmd "#{datasource_path}/xa-datasource-properties=#{property.to_s}:read-resource()" + if execute(cmd)[:result] + cmd = compilecmd "#{datasource_path}/xa-datasource-properties=#{property.to_s}:remove()" + bringDown "XA Datasource Property " + property.to_s, cmd + end + cmd = compilecmd "#{datasource_path}/xa-datasource-properties=#{property.to_s}:add(value=#{escape value})" + bringUp "XA Datasource Property set " + property.to_s, cmd + props = getattrib 'xa-datasource-properties' + props = {} if props.nil? + props[property.to_s] = {} if props[property.to_s].nil? + props[property.to_s]['value'] = value + end + + def readXaProperty property + if property == :Scheme + key = getPuppetKey property + scheme = @resource[key] + if getattrib('xa-datasource-properties')[property.to_s].nil? + getattrib('xa-datasource-properties')[property.to_s] = {} + end + getattrib('xa-datasource-properties')[property.to_s]['value'] = scheme + return scheme + end + readed = getattrib('xa-datasource-properties') + key = property.to_s + bm = BlankMatcher.new(readed[key]['value']) + if readed.nil? or readed[key].nil? or bm.blank? + name = @resource[:name] + cmd = compilecmd "#{datasource_path}/xa-datasource-properties=#{key}:read-attribute(name=value)" + result = executeAndGet cmd + readed[key]['value'] = result[:data] + end + return readed[key]['value'] + end + + def connectionHashFromXa + if h2? + parseConnectionUrl(readXaProperty 'URL') + else + props = [:Scheme, :ServerName, :PortNumber, :DatabaseName] + out = {} + props.each do |sym| + property = readXaProperty sym + out[sym] = property + end + out + end + end + + def connectionHashFromStd + parseConnectionUrl getattrib('connection-url').to_s + end + + def connectionHash + empty = { + :Scheme => nil, + :ServerName => nil, + :PortNumber => nil, + :DatabaseName => nil, + } + begin + if xa? then connectionHashFromXa else connectionHashFromStd end + rescue ArgumentError => e + Puppet.debug e + return empty + end + end + + def oracle? + scheme = @resource[:jdbcscheme] + scheme[0, 6] == 'oracle' + end + + def h2? + scheme = @resource[:jdbcscheme] + scheme[0, 2] == 'h2' + end + + def create_delete_cmd + cmd = "data-source" + if xa? + cmd = "xa-#{cmd}" + end + if @resource[:runasdomain] + cmd = "#{cmd} --profile=#{@resource[:profile]}" + end + return cmd + end + + def datasource_type + if xa? + "xa-data-source" + else + "data-source" + end + end + + def datasource_path + "/subsystem=datasources/#{datasource_type}=#{@resource[:name]}" + end + + def parseOracleConnectionUrl(url) + splited = url.split '@' + scheme = splited[0].sub 'jdbc:', '' + host, port, dbname = splited[1].split ':' + return { + :Scheme => scheme, + :ServerName => host, + :PortNumber => port.to_i, + :DatabaseName => dbname, + } + end + + def parseH2ConnectionUrl(url) + repl = url.sub('h2:', 'h2-') + parsed = parseOtherDbConnectionUrl(repl) + parsed[:Scheme] = parsed[:Scheme].sub('h2-', 'h2:') + parsed + end + + def parseOtherDbConnectionUrl(url) + uri = URI(url.sub('jdbc:', '')) + return { + :Scheme => uri.scheme, + :ServerName => uri.host, + :PortNumber => uri.port, + :DatabaseName => uri.path[1..-1], + } + end + + def parseConnectionUrl url + begin + if oracle? + parseOracleConnectionUrl(url) + elsif h2? + parseH2ConnectionUrl(url) + else + parseOtherDbConnectionUrl(url) + end + rescue NoMethodError, ArgumentError, RuntimeError => e + raise ArgumentError, "Invalid connection url: #{url}: #{e}" + end + end + + def connectionUrl + scheme = @resource[:jdbcscheme] + host = @resource[:host] + port = @resource[:port] + dbname = @resource[:dbname] + if oracle? + port = 1521 if port <= 0 + url = "#{scheme}@#{host}:#{port}:#{dbname}" + else + port_with_colon = if port > 0 then ":#{port}" else '' end + url = "#{scheme}://#{host}#{port_with_colon}/#{dbname}" + end + return "jdbc:#{url}" + end + +end diff --git a/lib/puppet_x/coi/jboss/provider/datasource/post_wildfly_provider.rb b/lib/puppet_x/coi/jboss/provider/datasource/post_wildfly_provider.rb index 59b10f5..8448c32 100644 --- a/lib/puppet_x/coi/jboss/provider/datasource/post_wildfly_provider.rb +++ b/lib/puppet_x/coi/jboss/provider/datasource/post_wildfly_provider.rb @@ -1,16 +1,5 @@ -# A puppet x module -module Puppet_X -# A COI puppet_x module -module Coi -# JBoss module -module Jboss -# JBoss provider module -module Provider -# JBoss datasource provider module -module Datasource - # A class for JBoss post WildFly datasource provider -class PostWildFlyProvider +class Puppet_X::Coi::Jboss::Provider::Datasource::PostWildFlyProvider def initialize(provider) @provider = provider end @@ -35,9 +24,3 @@ def jta_opt(cmd) cmd.push "--jta=#{@provider.resource[:jta].inspect}" unless @provider.xa? end end - -end -end -end -end -end \ No newline at end of file diff --git a/lib/puppet_x/coi/jboss/provider/datasource/pre_wildfly_provider.rb b/lib/puppet_x/coi/jboss/provider/datasource/pre_wildfly_provider.rb index 421288c..e0a05ce 100644 --- a/lib/puppet_x/coi/jboss/provider/datasource/pre_wildfly_provider.rb +++ b/lib/puppet_x/coi/jboss/provider/datasource/pre_wildfly_provider.rb @@ -1,16 +1,5 @@ -# A puppet x module -module Puppet_X -# A COI puppet_x module -module Coi -# JBoss module -module Jboss -# JBoss provider module -module Provider -# JBoss datasource provider module -module Datasource - # A class for JBoss pre WildFly datasource provider -class PreWildFlyProvider +class Puppet_X::Coi::Jboss::Provider::Datasource::PreWildFlyProvider def initialize(provider) @provider = provider end @@ -31,9 +20,3 @@ def jta_opt(cmd) cmd.push "--jta=#{@provider.resource[:jta].inspect}" end end - -end -end -end -end -end \ No newline at end of file diff --git a/lib/puppet_x/coi/jboss/provider/datasource/static.rb b/lib/puppet_x/coi/jboss/provider/datasource/static.rb new file mode 100644 index 0000000..f109564 --- /dev/null +++ b/lib/puppet_x/coi/jboss/provider/datasource/static.rb @@ -0,0 +1,50 @@ +# A module that holds JBoss datasource provider static metod +module Puppet_X::Coi::Jboss::Provider::Datasource::Static + + def instances + runasdomain = self.config_runasdomain + profile = self.config_profile + controller = self.config_controller + ctrlconfig = self.controllerConfig({ :controller => controller }) + list = [] + cmd = self.compilecmd runasdomain, profile, "/subsystem=datasources:read-children-names(child-type=#{self.datasource_type true})" + res = self.executeAndGet cmd, runasdomain, ctrlconfig, 0, 0 + if res[:result] + res[:data].each do |name| + inst = self.create_rubyobject name, true, runasdomain, profile, controller + list.push inst + end + end + cmd = self.compilecmd runasdomain, profile, "/subsystem=datasources:read-children-names(child-type=#{self.datasource_type false})" + res = self.executeAndGet cmd, runasdomain, ctrlconfig, 0, 0 + if res[:result] + res[:data].each do |name| + inst = self.create_rubyobject name, false, runasdomain, profile, controller + list.push inst + end + end + return list + end + + def create_rubyobject(name, xa, runasdomain, profile, controller) + props = { + :name => name, + :ensure => :present, + :provider => :jbosscli, + :xa => xa, + :runasdomain => runasdomain, + :profile => profile, + :controller => controller + } + obj = new(props) + return obj + end + + def datasource_type(xa) + if xa + "xa-data-source" + else + "data-source" + end + end +end diff --git a/lib/puppet_x/coi/jboss/provider/deploy.rb b/lib/puppet_x/coi/jboss/provider/deploy.rb new file mode 100644 index 0000000..3992917 --- /dev/null +++ b/lib/puppet_x/coi/jboss/provider/deploy.rb @@ -0,0 +1,96 @@ +# A class for JBoss deploy +module Puppet_X::Coi::Jboss::Provider::Deploy + def create + cmd = "deploy #{@resource[:source]} --name=#{@resource[:name]}" + if @resource[:runasdomain] + groups = @resource[:servergroups] + if groups.nil? or groups.empty? or groups == [''] + cmd = "#{cmd} --all-server-groups" + else + cmd = "#{cmd} --server-groups=#{groups.join(',')}" + end + end + if @resource[:redeploy] + cmd = "#{cmd} --force" + end + isprintinglog = 100 + bringUp 'Deployment', cmd + end + + def destroy + cmd = "undeploy #{@resource[:name]}" + if @resource[:runasdomain] + groups = @resource[:servergroups] + if groups.nil? or groups.empty? or groups == [''] + cmd = "#{cmd} --all-relevant-server-groups" + else + cmd = "#{cmd} --server-groups=#{groups.join(',')}" + end + end + isprintinglog = 0 + bringDown 'Deployment', cmd + end + + def exists? + if name_exists? + is_exact_deployment? + else + false + end + end + + def servergroups + if not @resource[:runasdomain] + return @resource[:servergroups] + end + servergroups = @resource[:servergroups] + res = execute("deployment-info --name=#{@resource[:name]}") + if not res[:result] + return [] + end + groups = [] + for line in res[:lines] + line.strip! + depinf = line.split + if(depinf[1] == "enabled" || depinf[1] == "added") + groups.push(depinf[0]) + end + end + if servergroups.nil? or servergroups.empty? or servergroups == [''] + return servergroups + end + return groups + end + + def servergroups=(value) + if not @resource[:runasdomain] + return nil + end + current = servergroups() + Puppet.debug(current.inspect()) + Puppet.debug(value.inspect()) + + toset = value - current + cmd = "deploy --name=#{@resource[:name]} --server-groups=#{toset.join(',')}" + res = bringUp('Deployment', cmd) + end + + private + def name_exists? + res = executeWithoutRetry "/deployment=#{@resource[:name]}:read-resource()" + if res[:outcome] == 'failed' + return false + end + unless res[:name].nil? + Puppet.debug "Deployment found: #{res[:name]}" + return true + end + Puppet.debug "No deployment matching #{@resource[:name]} found." + return false + end + + def is_exact_deployment? + true + end + +end diff --git a/lib/puppet_x/coi/jboss/provider/jdbcdriver.rb b/lib/puppet_x/coi/jboss/provider/jdbcdriver.rb new file mode 100644 index 0000000..482568e --- /dev/null +++ b/lib/puppet_x/coi/jboss/provider/jdbcdriver.rb @@ -0,0 +1,100 @@ +# A module for Jdbcdriver +module Puppet_X::Coi::Jboss::Provider::Jdbcdriver + + def create + name = @resource[:name] + map = get_attribs_map + + cmd = compilecmd "/subsystem=datasources/jdbc-driver=#{name}:add(#{cmdlize_attribs_map map})" + bringUp 'JDBC-Driver', cmd + end + + def destroy + cmd = compilecmd "/subsystem=datasources/jdbc-driver=#{@resource[:name]}:remove" + bringDown 'JDBC-Driver', cmd + end + + def exists? + @data = {} + cmd = compilecmd "/subsystem=datasources/jdbc-driver=#{@resource[:name]}:read-resource(recursive=true)" + res = executeAndGet cmd + if(res[:result] == false) + Puppet.debug("JDBC Driver #{@resource[:name]} does NOT exist") + return false + end + Puppet.debug("JDBC Driver exists: #{res[:data].inspect}") + @data = res[:data] + return true + end + + def setattrib name, value + Puppet.debug(name + ' setting to ' + value) + cmd = compilecmd "/subsystem=datasources/jdbc-driver=#{@resource[:name]}:write-attribute(name=#{name}, value=#{value})" + res = executeAndGet cmd + Puppet.debug res.inspect + if not res[:result] + raise "Cannot set #{name}: #{res[:data]}" + end + @data[name] = value + end + + def classname + @data['driver-class-name'] + end + + def classname= value + setattrib 'driver-class-name', value + end + + def modulename + @data['driver-module-name'] + end + + def modulename= value + setattrib 'driver-module-name', value + end + + def datasourceclassname + @data['driver-datasource-class-name'] + end + + def datasourceclassname= value + setattrib 'driver-datasource-class-name', value + end + + def xadatasourceclassname + @data['driver-xa-datasource-class-name'] + end + + def xadatasourceclassname= value + setattrib 'driver-xa-datasource-class-name', value + end + + private + + def get_attribs_map + name = @resource[:name] + modulename = @resource[:modulename] + datasourceclassname = @resource[:datasourceclassname] + xadatasourceclassname = @resource[:xadatasourceclassname] + classname = @resource[:classname] + map = { + 'driver-name' => name, + 'driver-module-name' => modulename + } + map['driver-datasource-class-name'] = datasourceclassname if datasourceclassname + map['driver-xa-datasource-class-name'] = xadatasourceclassname if xadatasourceclassname + map['driver-class-name'] = classname if classname + map + end + + def cmdlize_attribs_map input + list = [] + input.keys.sort.each do |key| + value = input[key] + list.push "#{key}=#{value.inspect}" + end + list.join ',' + end + +end diff --git a/lib/puppet_x/coi/jboss/provider/jmsqueue.rb b/lib/puppet_x/coi/jboss/provider/jmsqueue.rb new file mode 100644 index 0000000..b3397e4 --- /dev/null +++ b/lib/puppet_x/coi/jboss/provider/jmsqueue.rb @@ -0,0 +1,90 @@ +# A module for Jmsqueue +module Puppet_X::Coi::Jboss::Provider::Jmsqueue + include Puppet_X::Coi::Jboss::BuildinsUtils + def create + if runasdomain? + profile = "--profile=#{@resource[:profile]}" + else + profile = '' + end + entries = @resource[:entries].join '", "' + if not entries.empty? + entries = '["%s"]' % entries + else + raise "Array of entries can not be empty" + end + durable = ToBooleanConverter.new(@resource[:durable]).to_bool + extcmd = "/extension=org.jboss.as.messaging" + if not execute("#{extcmd}:read-resource()")[:result] + bringUp "Extension - messaging", "#{extcmd}:add()" + end + syscmd = compilecmd "/subsystem=messaging" + if not execute("#{syscmd}:read-resource()")[:result] + bringUp "Subsystem - messaging", "#{syscmd}:add()" + end + hornetcmd = compilecmd "/subsystem=messaging/hornetq-server=default" + if not execute("#{hornetcmd}:read-resource()")[:result] + bringUp "Default HornetQ", "#{hornetcmd}:add()" + end + cmd = "jms-queue #{profile} add --queue-address=#{@resource[:name]} --entries=#{entries} --durable=#{durable.to_s}" + bringUp "JMS Queue", cmd + end + + def destroy + if runasdomain? + profile = "--profile=#{@resource[:profile]}" + else + profile = '' + end + cmd = "jms-queue #{profile} remove --queue-address=#{@resource[:name]}" + bringDown "JMS Queue", cmd + end + + # + def exists? + $data = nil + cmd = compilecmd "/subsystem=messaging/hornetq-server=default/jms-queue=#{@resource[:name]}:read-resource()" + res = executeAndGet cmd + + if not res[:result] + Puppet.debug "JMS Queue do not exists" + return false + end + $data = res[:data] + return true + end + + def durable + trace 'durable' + Puppet.debug "Durable given: #{@resource[:durable].inspect}" + # normalization + ToBooleanConverter.new($data['durable']).to_bool.to_s + end + + def durable= value + trace 'durable= %s' % value.to_s + setattr 'durable', ('"%s"' % ToBooleanConverter.new(value).to_bool) + end + + def entries + trace 'entries' + $data['entries'] + end + + def entries= value + trace 'entries= %s' % value.inspect + entries = value.join '", "' + if not entries.empty? + entries = '["%s"]' % entries + else + raise "Array of entries can not be empty" + end + setattr 'entries', entries + end + + private + + def setattr name, value + setattribute_raw "/subsystem=messaging/hornetq-server=default/jms-queue=#{@resource[:name]}", name, value + end +end diff --git a/lib/puppet_x/coi/jboss/provider/securitydomain.rb b/lib/puppet_x/coi/jboss/provider/securitydomain.rb new file mode 100644 index 0000000..353c8fb --- /dev/null +++ b/lib/puppet_x/coi/jboss/provider/securitydomain.rb @@ -0,0 +1,69 @@ +# A class for JBoss security domain provider +module Puppet_X::Coi::Jboss::Provider::SecurityDomain + def create + cmd = "/subsystem=security/security-domain=#{@resource[:name]}/authentication=classic:add(login-modules=[{code=>\"#{@resource[:code]}\",flag=>\"#{@resource[:codeflag]}\",module-options=>[" + options = [] + @resource[:moduleoptions].keys.sort.each do |key| + value = @resource[:moduleoptions][key] + val = value.to_s.gsub(/\n/, ' ').strip + options << '%s => "%s"' % [key, val] + end + cmd += options.join(',') + "]}])" + cmd = compilecmd(cmd) + cmd2 = compilecmd "/subsystem=security/security-domain=#{@resource[:name]}:add(cache-type=default)" + bringUp('Security Domain Cache Type', cmd2)[:result] + bringUp('Security Domain', cmd)[:result] + end + + def destroy + cmd = compilecmd "/subsystem=security/security-domain=#{@resource[:name]}:remove()" + bringDown('Security Domain', cmd)[:result] + end + + def exists? + cmd = compilecmd "/subsystem=security/security-domain=#{@resource[:name]}/authentication=classic:read-resource()" + res = executeWithoutRetry cmd + if not res[:result] + Puppet.debug "Security Domain does NOT exist" + return false + end + undefined = nil + lines = preparelines res[:lines] + data = eval(lines)['result'] + Puppet.debug "Security Domain exists: #{data.inspect}" + + existinghash = Hash.new + givenhash = Hash.new + + unless @resource[:moduleoptions].nil? + @resource[:moduleoptions].each do |key, value| + givenhash["#{key}"] = value.to_s.gsub(/\n/, ' ').strip + end + end + + data['login-modules'][0]['module-options'].each do |key, value| + existinghash[key.to_s] = value.to_s.gsub(/\n/, ' ').strip + end + + if !existinghash.nil? && !givenhash.nil? && existinghash != givenhash + diff = givenhash.to_a - existinghash.to_a + Puppet.notice "Security domain should be recreated. Diff: #{diff.inspect}" + Puppet.debug "Security domain moduleoptions existing hash => #{existinghash.inspect}" + Puppet.debug "Security domain moduleoptions given hash => #{givenhash.inspect}" + destroy + return false + end + return true + end + + private + + # Method prepares lines outputed by JBoss CLI tool, changing output to be readable in Ruby + # + # @param {string[]} lines + def preparelines lines + lines. + gsub(/\((\"[^\"]+\") => (\"[^\"]+\")\)/, '\1 => \2'). + gsub(/\[((?:[\n\s]*\"[^\"]+\" => \"[^\"]+\",?[\n\s]*)+)\]/m, '{\1}') + end +end diff --git a/spec/functions/jboss_basename_spec.rb b/spec/functions/jboss_basename_spec.rb new file mode 100644 index 0000000..ab790f8 --- /dev/null +++ b/spec/functions/jboss_basename_spec.rb @@ -0,0 +1,18 @@ +require "spec_helper" + +describe 'jboss_basename', :type => :puppet_function do + + let(:input) { 'path/to/file' } + it do + is_expected.to run. + with_params(input).and_return('file') + end + + let(:input2) { ['path/to/file', 'path/to/file2'] } + it do + is_expected.to run. + with_params(input2). + and_return(['file', 'file2']) + end + +end diff --git a/spec/functions/jboss_dirname_spec.rb b/spec/functions/jboss_dirname_spec.rb new file mode 100644 index 0000000..dfbe144 --- /dev/null +++ b/spec/functions/jboss_dirname_spec.rb @@ -0,0 +1,16 @@ +require "spec_helper" + +describe 'jboss_dirname', :type => :puppet_function do + + let(:input) { 'path/to/file' } + it do + should run. + with_params(input).and_return('path/to') + end + + let(:input2) { ['path/to/file', 'path/to/file2'] } + it do + should run. + with_params(input2).and_return(['path/to', 'path/to']) + end +end diff --git a/spec/functions/jboss_hash_setvalue_spec.rb b/spec/functions/jboss_hash_setvalue_spec.rb new file mode 100644 index 0000000..76807af --- /dev/null +++ b/spec/functions/jboss_hash_setvalue_spec.rb @@ -0,0 +1,39 @@ +require "spec_helper" + +describe 'jboss_hash_setvalue', :type => :puppet_function do + + context 'given invalid number of arguments(4)' do + it do + should run. + with_params(1,2,1,1).and_raise_error( + Puppet::ParseError, + "jboss_hash_setvalue(): wrong lenght of input given (4 for 3)" + ) + end + end + + context 'given invalid number of arguments(2)' do + it do + should run. + with_params(1,2).and_raise_error( + Puppet::ParseError, + "jboss_hash_setvalue(): wrong lenght of input given (2 for 3)" + ) + end + end + + context "given input => { 'john' = 'cena' }, 'adam', 'smith' it should return => { john => 'cena', adam => 'smith' }" do + before { skip('FIXME: Method should return hash not only last key, ref coi-gov-pl/puppet-jboss#28 ') } + let(:input) { { 'john' => 'cena' } } + it do + should run. + with_params(input, 'adam', 'smith').and_return('smith') + end + + after(:each) do + expect(input).to include('adam' => 'smith') + expect(input).to include('john' => 'cena') + expect(input.size).to eq(2) + end + end +end diff --git a/spec/functions/jboss_short_version_spec.rb b/spec/functions/jboss_short_version_spec.rb new file mode 100644 index 0000000..e28400e --- /dev/null +++ b/spec/functions/jboss_short_version_spec.rb @@ -0,0 +1,33 @@ +require "spec_helper" + +describe 'jboss_short_version', :type => :puppet_function do + + describe 'with zero parameters given' do + it do + should run. + with_params().and_raise_error( + Puppet::ParseError, + 'jboss_short_version(): Wrong number of arguments given (0 for 1)' + ) + end + end + + describe 'with two parameters given' do + it do + should run. + with_params('as-7.1.1.Final', 'eap-6.2.0.GA').and_raise_error( + Puppet::ParseError, + 'jboss_short_version(): Wrong number of arguments given (2 for 1)' + ) + end + end + + describe 'with as-7.1.1.Final as input it should return 7.1' do + let(:args) { ['as-7.1.1.Final'] } + it { should run.with_params(args[0]).and_return '7.1' } + end + + describe 'with asd as input it should return nil' do + it { should run.with_params('asd').and_return nil } + end +end diff --git a/spec/functions/jboss_type_version_spec.rb b/spec/functions/jboss_type_version_spec.rb new file mode 100644 index 0000000..e3a378b --- /dev/null +++ b/spec/functions/jboss_type_version_spec.rb @@ -0,0 +1,30 @@ +require "spec_helper" + +describe 'jboss_type_version' do + + context 'given invalid number of parameters' do + it do + should run. + with_params().and_raise_error( + Puppet::ParseError, + 'jboss_type_version(): Given invalid number of parameters(0 instead of 1)' + ) + end + end + + context 'given as-7.1.1.Final it should return as' do + let(:input) { 'as-7.1.1.Final' } + it do + should run. + with_params(input).and_return('as') + end + end + + context 'given invalid input' do + let(:input) { 'asd' } + it do + should run. + with_params(input).and_return(nil) + end + end +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 86d6702..cadf4b8 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -67,3 +67,5 @@ PuppetlabsSpec::Files.cleanup end end + +require 'puppet_x/coi/jboss' diff --git a/spec/unit/facter/jboss_fullconfig_spec.rb b/spec/unit/facter/jboss_fullconfig_spec.rb index c89389b..9100056 100644 --- a/spec/unit/facter/jboss_fullconfig_spec.rb +++ b/spec/unit/facter/jboss_fullconfig_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' -require 'puppet_x/coi/jboss/configuration' describe 'Fact jboss_fullconfig', :type => :fact do + let(:sample_config) do t = Tempfile.new('rspec-jboss-fullconfig') path = t.path @@ -13,44 +13,44 @@ # The Jboss home directory. # JBOSS_HOME=/usr/lib/wildfly-12.2.0.Final - + # The JBoss product name. # JBOSS_PRODUCT=wildfly - + # The JBoss version. # JBOSS_VERSION=12.2.0.Final - + # The JBoss configuration file # JBOSS_CONFIG=standalone-full.xml - + # The username who should own the process. # JBOSS_USER=wildfly - + # The amount of time to wait for startup # # STARTUP_WAIT=30 - + # The amount of time to wait for shutdown # # SHUTDOWN_WAIT=30 - + # Location to keep the console log # JBOSS_CONSOLE_LOG=/var/log/wildfly/console.log - + # Runs JBoss in domain mode? JBOSS_RUNASDOMAIN=false - + # JBoss running mode: domain or standalone JBOSS_MODE=standalone - + # Default JBoss domain controller JBOSS_CONTROLLER=127.0.0.1:9990 - + # Default JBoss domain profile JBOSS_PROFILE=full eos @@ -89,13 +89,38 @@ File.unlink(sample_config) end subject { Facter.value(:jboss_fullconfig) } + shared_examples 'is not nill and empty' do + it { expect(subject).not_to be_nil } + it { expect(subject).not_to be_empty } + end context 'with sample config file for WildFly 8.2' do - context 'return value' do - it { expect(subject).not_to be_nil } - it { expect(subject).not_to be_empty } + context 'without mocking RUBY_VERSION' do + it_behaves_like 'is not nill and empty' it { expect(subject).to respond_to(:[]) } its(:size) { should eq(10) } it { expect(subject).to eq(expected_hash) } end + + context 'with mocking RUBY_VERSION to 1.8.7' do + before :each do + expect(Puppet_X::Coi::Jboss::Configuration).to receive(:ruby_version).once.and_return('1.8.7') + end + + it_behaves_like 'is not nill and empty' + let('subject_sorted') { eval(subject.to_s).to_a.sort } + let("expected_output") {[["config", "standalone-full.xml"], + ["console_log", "/var/log/wildfly/console.log"], + ["controller", "127.0.0.1:9990"], + ["home", "/usr/lib/wildfly-12.2.0.Final"], + ["mode", "standalone"], + ["product", "wildfly"], + ["profile", "full"], + ["runasdomain", false], + ["user", "wildfly"], + ["version", "12.2.0.Final"]] + } + + it { expect(subject_sorted).to eq(expected_output)} + end end -end \ No newline at end of file +end diff --git a/spec/unit/lib/coi_require_relative_spec.rb b/spec/unit/lib/coi_require_relative_spec.rb new file mode 100644 index 0000000..b0f87da --- /dev/null +++ b/spec/unit/lib/coi_require_relative_spec.rb @@ -0,0 +1,15 @@ +require 'spec_helper' + +describe Puppet_X::Coi do + describe '#require_relative' do + let(:target) { 'mocked/file' } + subject { Puppet_X::Coi::require_relative(target) } + let(:test_stmt) do + subject + NonExistentInAnyContextClassUsedOnlyForTesting.new.test + end + + it { expect { subject }.not_to raise_error } + it { expect(test_stmt).to eq(42) } + end +end diff --git a/spec/unit/lib/mocked/file.rb b/spec/unit/lib/mocked/file.rb new file mode 100644 index 0000000..d5dfcdd --- /dev/null +++ b/spec/unit/lib/mocked/file.rb @@ -0,0 +1,5 @@ +class NonExistentInAnyContextClassUsedOnlyForTesting + def test + 42 + end +end diff --git a/spec/unit/lib/provider/datasource/post_wildfly_provider_spec.rb b/spec/unit/lib/provider/datasource/post_wildfly_provider_spec.rb index 10007d7..ec865b8 100644 --- a/spec/unit/lib/provider/datasource/post_wildfly_provider_spec.rb +++ b/spec/unit/lib/provider/datasource/post_wildfly_provider_spec.rb @@ -1,5 +1,4 @@ require 'spec_helper' -require 'puppet_x/coi/jboss/provider/datasource/post_wildfly_provider' describe Puppet_X::Coi::Jboss::Provider::Datasource::PostWildFlyProvider do @@ -22,4 +21,4 @@ subject { target.jta } it { expect(subject).to eq('true') } end -end \ No newline at end of file +end diff --git a/spec/unit/lib/provider/datasource/pre_wildfly_provider_spec.rb b/spec/unit/lib/provider/datasource/pre_wildfly_provider_spec.rb index f640c81..3d3a014 100644 --- a/spec/unit/lib/provider/datasource/pre_wildfly_provider_spec.rb +++ b/spec/unit/lib/provider/datasource/pre_wildfly_provider_spec.rb @@ -1,5 +1,4 @@ require 'spec_helper' -require 'puppet_x/coi/jboss/provider/datasource/pre_wildfly_provider' describe Puppet_X::Coi::Jboss::Provider::Datasource::PreWildFlyProvider do @@ -10,4 +9,4 @@ subject { target.xa_datasource_properties_wrapper(parameters) } it { expect(subject).to eq('[david=one,martha=tree]') } end -end \ No newline at end of file +end diff --git a/spec/unit/provider/jboss_confignode/confignode_spec.rb b/spec/unit/provider/jboss_confignode/confignode_spec.rb new file mode 100644 index 0000000..12bae4a --- /dev/null +++ b/spec/unit/provider/jboss_confignode/confignode_spec.rb @@ -0,0 +1,467 @@ +require "spec_helper" + +context "mocking default values" do + + let(:mock_values) do + { + :product => 'jboss-eap', + :version => '6.4.0.GA', + :controller => '127.0.0.1:9999', + } + end + + before :each do + Puppet_X::Coi::Jboss::Configuration.reset_config(mock_values) + end + + after :each do + Puppet_X::Coi::Jboss::Configuration.reset_config + end + + describe 'Puppet::Type::Jboss_confignode::ProviderJbosscli' do + + let(:described_class) do + Puppet::Type.type(:jboss_confignode).provider(:jbosscli) + end + let(:sample_repl) do + { + :name => '/subsystem=messaging/hornetq-server=default', + :path => '/subsystem=messaging/hornetq-server=default', + :ensure => 'present', + :properties => { + 'security-enabled' => false, + 'some-other-prop' => nil + } + } + end + + let(:extended_repl) do + {} + end + + let(:resource) do + raw = sample_repl.merge(extended_repl) + raw[:provider] = described_class.name + + Puppet::Type.type(:jboss_confignode).new(raw) + end + + let(:provider) do + resource.provider + end + + before :each do + allow(provider.class).to receive(:suitable?).and_return(true) + end + + describe '#exists? with clean => true and result => false' do + before :each do + provider.instance_variable_set(:@clean, false) + + cmd = + '/profile=full/subsystem=messaging/hornetq-server=default:read-resource(include-runtime=true, include-defaults=false)' + + expected_output = { + :result => false, + } + + expect(provider).to receive(:executeAndGet).with(cmd).and_return(expected_output) + end + + subject { provider.exists? } + it { expect(subject).to eq(false) } + end + + describe '#exists? with clean => true and result => true' do + before :each do + provider.instance_variable_set(:@clean, false) + + cmd = + '/profile=full/subsystem=messaging/hornetq-server=default:read-resource(include-runtime=true, include-defaults=false)' + + expected_output = { + :result => true, + :data => { + :includeruntime => true, + :includedefaults => false, + } + } + + expect(provider).to receive(:executeAndGet).with(cmd).and_return(expected_output) + end + + subject { provider.exists? } + it { expect(subject).to eq(true) } + end + + describe '#exists? with clean => false [wrong context]' do + before :each do + provider.instance_variable_set(:@clean, true) + end + + subject { provider.exists? } + it { expect(subject).to eq(false) } + end + + describe '#destroy with exists? => false' do + before :each do + expect(provider).to receive(:exists?).and_return(false) + end + + subject { provider.destroy } + it { expect(subject).to eq(nil) } + end + + describe '#destroy with status == :running and later on :ensure' do + before :each do + + bringDownName = 'Configuration node STOP' + cmd = '/profile=full/subsystem=messaging/hornetq-server=default:stop(blocking=true)' + + bringDownNameDestroy = 'Configuration node' + cmdDestroy = '/profile=full/subsystem=messaging/hornetq-server=default:remove()' + + expect(provider).to receive(:exists?).and_return(true) + expect(provider).to receive(:status).and_return(:running) + expect(provider).to receive(:status).and_return(:ensure) + expect(provider).to receive(:bringDown).with(bringDownName, cmd).and_return(true) + expect(provider).to receive(:bringDown).with(bringDownNameDestroy, cmdDestroy).and_return(true) + end + + subject { provider.destroy } + it { expect(subject).to eq(true) } + end + + describe '#destroy with exists? => true and status :running => nil' do + before :each do + + bringDownName = 'Configuration node' + cmd = '/profile=full/subsystem=messaging/hornetq-server=default:remove()' + + expect(provider).to receive(:bringDown).with(bringDownName, cmd).and_return(true) + expect(provider).to receive(:exists?).and_return(true, true) + end + + + subject { provider.destroy } + it { expect(subject).to eq(true) } + end + + describe "#create with exists? => true" do + before :each do + expect(provider).to receive(:exists?).and_return(true) + end + + subject { provider.create } + it { expect(subject).to eq(nil) } + end + + + describe "#create with exists? => false" do + before :each do + + bringUpName = 'Configuration node' + cmd = '/profile=full/subsystem=messaging/hornetq-server=default:add(security-enabled=false)' + + expect(provider).to receive(:exists?).and_return(false) + expect(provider).to receive(:bringUp).with(bringUpName, cmd).and_return(true) + end + + subject { provider.create } + it { expect(subject).to eq(true) } + end + + describe '#ensure no specific value' do + before :each do + data = { + :status => 'true', + } + + provider.instance_variable_set(:@data, data) + + expect(provider).to receive(:exists?).and_return(true) + end + + subject { provider.ensure } + it { expect(subject).to eq(:present) } + end + + describe '#ensure with status => disabled' do + before :each do + data = { + 'status' => 'disabled', + } + + provider.instance_variable_set(:@data, data) + + expect(provider).to receive(:exists?).and_return(true) + end + + subject { provider.ensure } + it { expect(subject).to eq(:disabled) } + end + + describe '#ensure with status => RUNNING' do + before :each do + data = { + 'status' => 'RUNNING', + } + + provider.instance_variable_set(:@data, data) + + expect(provider).to receive(:exists?).and_return(true) + end + + subject { provider.ensure } + it { expect(subject).to eq(:running) } + end + + describe '#ensure with status => else' do + before :each do + data = { + 'status' => 'else', + } + + provider.instance_variable_set(:@data, data) + + expect(provider).to receive(:exists?).and_return(true) + end + + subject { provider.ensure } + it { expect(subject).to eq(:stopped) } + end + + describe '#ensure with enabled => true' do + before :each do + data = { + 'enabled' => true, + } + + provider.instance_variable_set(:@data, data) + + expect(provider).to receive(:exists?).and_return(true) + end + + subject { provider.ensure } + it { expect(subject).to eq(:enabled) } + end + + describe '#ensure with enabled => else' do + before :each do + data = { + 'enabled' => false, + } + + provider.instance_variable_set(:@data, data) + + expect(provider).to receive(:exists?).and_return(true) + end + + subject { provider.ensure } + it { expect(subject).to eq(:disabled) } + end + + describe '#ensure :asd' do + before :each do + end + + subject { provider.ensure = 'asd' } + it { expect(subject).to eq('asd') } + end + + describe '#ensure :present' do + before :each do + end + + subject { provider.ensure = 'asd' } + it { expect(subject).to eq('asd') } + end + + describe '#ensure :present' do + before :each do + + expect(provider).to receive(:create).and_return(true) + end + + subject { provider.ensure = :present } + it { expect(subject).to eq(:present) } + end + + describe '#ensure :absent' do + before :each do + + expect(provider).to receive(:destroy).and_return(true) + end + + subject { provider.ensure = :absent } + it { expect(subject).to eq(:absent) } + end + + describe '#ensure :running' do + before :each do + + expect(provider).to receive(:doStart).and_return(true) + end + + subject { provider.ensure = :running } + it { expect(subject).to eq(:running) } + end + + describe '#ensure :stopped' do + before :each do + + expect(provider).to receive(:doStop).and_return(true) + end + + subject { provider.ensure = :stopped } + it { expect(subject).to eq(:stopped) } + end + + describe '#ensure :enabled with status :ensure' do + before :each do + + bringUpName = 'Configuration node ENABLE' + cmd = '/profile=full/subsystem=messaging/hornetq-server=default:enable()' + + expect(provider).to receive(:status).and_return(:ensure) + expect(provider).to receive(:bringUp).with(bringUpName, cmd).and_return(true) + end + + subject { provider.ensure = :enabled } + it { expect(subject).to eq(:enabled) } + end + + describe '#ensure :enabled with status :absent' do + before :each do + + bringUpName = 'Configuration node ENABLE' + cmd = '/profile=full/subsystem=messaging/hornetq-server=default:enable()' + + expect(provider).to receive(:status).and_return(:ensure) + expect(provider).to receive(:bringUp).with(bringUpName, cmd).and_return(true) + end + + subject { provider.ensure = :enabled } + it { expect(subject).to eq(:enabled) } + end + + describe '#ensure= value with value => :running' do + before :each do + bringUpName = 'Configuration node START' + cmd = '/profile=full/subsystem=messaging/hornetq-server=default:start(blocking=true)' + + expect(provider).to receive(:status).and_return(:absent) + expect(provider).to receive(:create).and_return(true) + expect(provider).to receive(:bringUp).with(bringUpName, cmd).and_return(true) + end + + subject {provider.ensure= :running} + it { expect(subject).to eq(:running) } + end + + describe '#ensure :disabled' do + before :each do + + expect(provider).to receive(:doDisable).and_return(true) + end + + subject { provider.ensure = :disabled } + it { expect(subject).to eq(:disabled) } + end + + describe '#ensure= value with value => :stopped' do + before :each do + bringUpName = 'Configuration node STOP' + cmd = '/profile=full/subsystem=messaging/hornetq-server=default:stop(blocking=true)' + + expect(provider).to receive(:status).and_return(:absent) + expect(provider).to receive(:create).and_return(true) + expect(provider).to receive(:bringDown).with(bringUpName, cmd).and_return(true) + end + + subject {provider.ensure= :stopped} + it { expect(subject).to eq(:stopped) } + end + + describe '#ensure= value with value => :enabled' do + before :each do + bringUpName = 'Configuration node ENABLE' + cmd = '/profile=full/subsystem=messaging/hornetq-server=default:enable()' + + expect(provider).to receive(:status).and_return(:absent) + expect(provider).to receive(:create).and_return(true) + expect(provider).to receive(:bringUp).with(bringUpName, cmd).and_return(true) + end + + subject {provider.ensure= :enabled} + it { expect(subject).to eq(:enabled) } + end + + describe '#ensure= value with value => :disabled' do + before :each do + bringUpName = 'Configuration node DISABLE' + cmd = '/profile=full/subsystem=messaging/hornetq-server=default:disable()' + + expect(provider).to receive(:status).and_return(:absent) + expect(provider).to receive(:create).and_return(true) + expect(provider).to receive(:bringDown).with(bringUpName, cmd).and_return(true) + end + + subject {provider.ensure= :disabled} + it { expect(subject).to eq(:disabled) } + end + + describe '#properties and @data => nil' do + before :each do + provider.instance_variable_set(:@data, nil) + end + + subject { provider.properties } + it { expect(subject).to eq({}) } + end + + describe '#properties and @data => asd ' do + before :each do + property_hash = { :properties => { + 'security-enabled' => false, + }} + provider.instance_variable_set(:@data, 'asd') + provider.instance_variable_set(:@property_hash, property_hash) + end + + subject { provider.properties } + it { expect(subject).to eq({"security-enabled"=>false}) } + end + + describe '#properties and @data => asd and value is keyword' do + before :each do + property_hash = { :properties => { + 'security-enabled' => :false, + }} + provider.instance_variable_set(:@data, 'asd') + provider.instance_variable_set(:@property_hash, property_hash) + end + + subject { provider.properties } + it { expect(subject).to eq({"security-enabled"=>"false"}) } + end + + describe '#properties' do + before :each do + data = { :aaa => :bbb} + provider.instance_variable_set(:@data, data) + + bringUpName = 'Configuration node property' + cmd = '/profile=full/subsystem=messaging/hornetq-server=default:write-attribute(name=security-enabled, value=:false)' + + expect(provider).to receive(:bringUp).with(bringUpName, cmd).and_return(true) + end + + props = { + 'security-enabled' => :false, + } + subject { provider.properties = props } + it { expect(subject).to eq({"security-enabled"=>:false}) } + end +end +end diff --git a/spec/unit/provider/jboss_datasource/jbosscli_spec.rb b/spec/unit/provider/jboss_datasource/jbosscli_spec.rb index da25f44..6aa83fb 100644 --- a/spec/unit/provider/jboss_datasource/jbosscli_spec.rb +++ b/spec/unit/provider/jboss_datasource/jbosscli_spec.rb @@ -1,5 +1,5 @@ -require 'spec_helper' -require 'puppet_x/coi/jboss/configuration' +require "spec_helper" +require "puppet_x/coi/jboss/configuration" context "While mocking facts :jboss_product => 'jboss-eap' and :jboss_version => '6.4.0.GA'" do @@ -14,7 +14,7 @@ before :each do Puppet_X::Coi::Jboss::Configuration.reset_config(mock_values) end - + after :each do Puppet_X::Coi::Jboss::Configuration.reset_config end @@ -32,21 +32,21 @@ :jdbcscheme => 'h2:mem', } end - + let(:resource) do raw = sample_repl.dup raw[:provider] = described_class.name Puppet::Type.type(:jboss_datasource).new(raw) end - + let(:provider) do resource.provider end - + before :each do allow(provider.class).to receive(:suitable?).and_return(true) end - + describe 'Result of self.instances()' do let(:xa_result) do <<-eos @@ -69,16 +69,16 @@ end let(:status) { double(:exitstatus => 0) } before :each do - re = /.*bin\/jboss-cli.sh --timeout=50000 --connect --file=\/tmp\/jbosscli.* --controller=127.0.0.1:9999/ - expect(Puppet::Provider::Jbosscli).to receive(:last_execute_status). + re = /.*bin\/jboss-cli.sh --timeout=50000 --connect --file=.+jbosscli.* --controller=127.0.0.1:9999/ + expect(Puppet_X::Coi::Jboss::Provider::AbstractJbossCli).to receive(:last_execute_status). at_least(:once).and_return(status) - expect(Puppet::Provider::Jbosscli).to receive(:execshell). + expect(Puppet_X::Coi::Jboss::Provider::AbstractJbossCli).to receive(:execshell). at_least(:once).with(re).and_return(xa_result, nonxa_result) end it { expect(provider.class.instances).not_to be_empty } context 'its size' do subject { provider.class.instances.size } - it { expect(subject).to eq(2) } + it { expect(subject).to eq(2) } end context 'for second result, parameter' do subject { provider.class.instances[1] } @@ -87,7 +87,7 @@ its(:xa) { should eq(false) } end end - + context 'Given `testing` Non-XA datasource using h2:mem' do let(:command) do '/subsystem=datasources/data-source=testing:read-resource(recursive=true)' @@ -96,7 +96,7 @@ let(:timeout) { 0 } let(:retry_count) { 0 } let(:ctrlcfg) do - { + { :controller => "127.0.0.1:9990", :ctrluser => nil, :ctrlpasswd => nil @@ -168,30 +168,30 @@ "testing;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE" end before :each do - expect(Puppet::Provider::Jbosscli).to receive(:executeAndGet). + expect(Puppet_X::Coi::Jboss::Provider::AbstractJbossCli).to receive(:executeAndGet). with(command, runasdomain, ctrlcfg, retry_count, timeout).and_return(result) end - + describe 'result of dbname()' do subject { provider.dbname } it { expect(subject).not_to be_nil } it { expect(subject).not_to be_empty } it { expect(subject).to eq(expected_connection) } end - + describe 'result of host()' do subject { provider.host } it { expect(subject).not_to be_nil } it { expect(subject).to be_empty } it { expect(subject).to eq('') } end - + describe 'result of port()' do subject { provider.port } it { expect(subject).not_to be_nil } it { expect(subject).to eq(0) } end - + describe 'result of jdbcscheme()' do subject { provider.jdbcscheme } it { expect(subject).not_to be_nil } @@ -360,4 +360,4 @@ end end -end \ No newline at end of file +end diff --git a/spec/unit/provider/jboss_deploy/jboss_deploy_spec.rb b/spec/unit/provider/jboss_deploy/jboss_deploy_spec.rb new file mode 100644 index 0000000..e972eb7 --- /dev/null +++ b/spec/unit/provider/jboss_deploy/jboss_deploy_spec.rb @@ -0,0 +1,296 @@ +require "spec_helper" + +context "mocking default values" do + + let(:mock_values) do + { + :product => 'jboss-eap', + :version => '6.4.0.GA', + :controller => '127.0.0.1:9999', + } + end + + before :each do + Puppet_X::Coi::Jboss::Configuration.reset_config(mock_values) + end + + after :each do + Puppet_X::Coi::Jboss::Configuration.reset_config + end + + describe 'Puppet::Type::Jboss_deploy::ProviderJbosscli' do + + let(:described_class) do + Puppet::Type.type(:jboss_deploy).provider(:jbosscli) + end + let(:sample_repl) do + { + :name => 'super-crm-1.1.0', + :source => '/usr/src/super-crm-1.1.0.war', + } + end + + let(:extended_repl) do + {} + end + + let(:resource) do + raw = sample_repl.merge(extended_repl) + raw[:provider] = described_class.name + + Puppet::Type.type(:jboss_deploy).new(raw) + end + + let(:provider) do + resource.provider + end + + before :each do + allow(provider.class).to receive(:suitable?).and_return(true) + end + + describe '#create with servergroups nill' do + before :each do + bringDownName = 'Deployment' + cmd = 'deploy /usr/src/super-crm-1.1.0.war --name=super-crm-1.1.0 --all-server-groups' + expect(provider).to receive(:bringUp).with(bringDownName, cmd ).and_return('asd') + end + subject { provider.create } + it { expect(subject).to eq('asd') } + end + + describe '#create wit servergroups not nill' do + before :each do + bringDownName = 'Deployment' + cmd = 'deploy /usr/src/super-crm-1.1.0.war --name=super-crm-1.1.0 --server-groups=crm-servers' + + expect(provider).to receive(:bringUp).with(bringDownName, cmd ).and_return('asd') + end + + let(:extended_repl) { { + :servergroups => ['crm-servers'], + } } + subject { provider.create } + + it { expect(subject).to eq('asd') } + end + + describe '#create with redeploy' do + before :each do + bringDownName = 'Deployment' + cmd = 'deploy /usr/src/super-crm-1.1.0.war --name=super-crm-1.1.0 --all-server-groups --force' + + expect(provider).to receive(:bringUp).with(bringDownName, cmd ).and_return('asd') + end + let(:extended_repl) { { + :redeploy => true, + } } + subject { provider.create } + it { expect(subject).to eq('asd') } + end + + describe '#destroy with runasdomain => true' do + before :each do + bringDownName = 'Deployment' + cmd = 'undeploy super-crm-1.1.0 --all-relevant-server-groups' + + expect(provider).to receive(:bringDown).with(bringDownName, cmd).and_return('asd') + end + let(:extended_repl) { { + :runasdomain => true + } } + + subject { provider.destroy } + it { expect(subject).to eq('asd') } + end + + describe '#destroy with servergroups nill' do + before :each do + bringDownName = 'Deployment' + cmd = 'undeploy super-crm-1.1.0 --all-relevant-server-groups' + expect(provider).to receive(:bringDown).with(bringDownName, cmd).and_return('asd') + end + + let(:extended_repl) { { + :runasdomain => true + } } + + subject { provider.destroy } + it { expect(subject).to eq('asd') } + end + + describe '#destroy with servergroups not nill' do + before :each do + bringDownName = 'Deployment' + cmd = 'undeploy super-crm-1.1.0 --server-groups=crm-servers' + expect(provider).to receive(:bringDown).with(bringDownName, cmd).and_return('asd') + end + + let(:extended_repl) { { + :runasdomain => true, + :servergroups => ['crm-servers'], + } } + + subject { provider.destroy } + it { expect(subject).to eq('asd') } + end + + describe '#exist? with tests for name_exists?' do + before :each do + allow(provider).to receive(:is_exact_deployment?).and_return(:expected_mocked_output) + end + describe '#name_exists? and outcome => failed' do + before :each do + cmd = "/deployment=super-crm-1.1.0:read-resource()" + expected_output = { :outcome => 'failed'} + + expect(provider).to receive(:executeWithoutRetry).with(cmd).and_return(expected_output) + end + + subject { provider.exists? } + it { expect(subject).to eq(false) } + end + + describe '#exists? and :outcome => success and :name => asd' do + before :each do + cmd = "/deployment=super-crm-1.1.0:read-resource()" + expected_output = { + :outcome => 'success', + :name => 'asd', + } + + expect(provider).to receive(:executeWithoutRetry).with(cmd).and_return(expected_output) + end + + subject { provider.exists? } + it { expect(subject).to eq(:expected_mocked_output) } + end + + describe '#name_exists? and :outcome => success and :name => nil' do + before :each do + cmd = "/deployment=super-crm-1.1.0:read-resource()" + expected_output = { + :outcome => 'success', + } + + expect(provider).to receive(:executeWithoutRetry).with(cmd).and_return(expected_output) + end + + subject { provider.exists? } + it { expect(subject).to eq(false) } + end + end + + describe '#servergroups with runasdomain => false' do + before :each do + end + + let(:extended_repl) { { + :runasdomain => false, + :servergroups => ['crm-servers'], + } } + + subject { provider.servergroups } + it { expect(subject).to eq(['crm-servers']) } + end + + describe '#servergroups with runasdomain => true and :result => false' do + before :each do + + expected_output = { + :result => false, + :name => 'asd', + } + + cmd = "deployment-info --name=#{resource[:name]}" + + expect(provider).to receive(:execute).with(cmd).and_return(expected_output) + end + + let(:extended_repl) { { + :runasdomain => true, + } } + + subject { provider.servergroups } + it { expect(subject).to eq([]) } + end + + describe '#servergroups with runasdomain => true and :result => true and lines => added and :servergroups => not nil' do + before :each do + + content = <<-eos + NAME RUNTIME-NAME + super-crm super-crm + + SERVER-GROUP STATE + app-group added + eos + + lines = content.split("\n") + + expected_output = { + :result => true, + :name => 'asd', + :lines => lines, + } + + cmd = "deployment-info --name=#{resource[:name]}" + + expect(provider).to receive(:execute).with(cmd).and_return(expected_output) + end + + let(:extended_repl) { { + :runasdomain => true, + :servergroups => 'crm-servers', + } } + + subject { provider.servergroups } + it { expect(subject).to eq(['app-group']) } + end + + describe '#servergroups with runasdomain => true and :result => true and lines => added and :servergroups => nil' do + before :each do + + content = <<-eos + NAME RUNTIME-NAME + super-crm super-crm + + SERVER-GROUP STATE + app-group added + eos + + lines = content.split("\n") + + expected_output = { + :result => true, + :name => 'asd', + :lines => lines, + } + + cmd = "deployment-info --name=#{resource[:name]}" + + expect(provider).to receive(:execute).with(cmd).and_return(expected_output) + end + + let(:extended_repl) { { + :runasdomain => true, + } } + + subject { provider.servergroups } + it { expect(subject).to eq(nil) } + end + + describe '#servergroups with value' do + before :each do + cmd = "deploy --name=#{resource[:name]} --server-groups=super-crm-1" + + expect(provider).to receive(:servergroups).and_return(['super-crm']) + expect(provider).to receive(:bringUp).with('Deployment', cmd).and_return('asd') + end + + subject { provider.servergroups = ['super-crm', 'super-crm-1'] } + it { expect(subject).to eq(["super-crm", "super-crm-1"]) } + end + +end +end diff --git a/spec/unit/provider/jboss_jdbcdriver/jbosscli_spec.rb b/spec/unit/provider/jboss_jdbcdriver/jbosscli_spec.rb new file mode 100644 index 0000000..a6e0bb7 --- /dev/null +++ b/spec/unit/provider/jboss_jdbcdriver/jbosscli_spec.rb @@ -0,0 +1,105 @@ +require "spec_helper" + +context "mocking default values" do + + let(:mock_values) do + { + :product => 'jboss-eap', + :version => '6.4.0.GA', + :controller => '127.0.0.1:9999', + } + end + + before :each do + Puppet_X::Coi::Jboss::Configuration.reset_config(mock_values) + end + + after :each do + Puppet_X::Coi::Jboss::Configuration.reset_config + end + + describe 'Puppet::Type::Jboss_jdbcdriver::ProviderJbosscli' do + + let(:described_class) do + Puppet::Type.type(:jboss_jdbcdriver).provider(:jbosscli) + end + let(:sample_repl) do + { + :name => 'app-mails', + :modulename => 'super-crm', + :datasourceclassname => 'datasourceclassname', + :xadatasourceclassname => 'xadsname', + :classname => 'driverclasname', + } + end + + let(:extended_repl) do + {} + end + + let(:resource) do + raw = sample_repl.merge(extended_repl) + raw[:provider] = described_class.name + + Puppet::Type.type(:jboss_jdbcdriver).new(raw) + end + + let(:provider) do + resource.provider + end + + before :each do + allow(provider.class).to receive(:suitable?).and_return(true) + end + + describe '#create' do + before :each do + + cmdlizedMap = 'driver-class-name="driverclasname",driver-datasource-class-name="datasourceclassname",driver-module-name="super-crm",driver-name="app-mails",driver-xa-datasource-class-name="xadsname"' + + + cmd = "/subsystem=datasources/jdbc-driver=app-mails:add(#{cmdlizedMap})" + compiledcmd = "/profile=full-ha/#{cmd}" + bringUpName = 'JDBC-Driver' + expect(provider).to receive(:compilecmd).with(cmd).and_return(compiledcmd) + + expect(provider).to receive(:bringUp).with(bringUpName, compiledcmd).and_return(true) + end + + subject { provider.create } + it { expect(subject).to eq(true) } + end + + describe '#destroy' do + before :each do + + cmd = "/subsystem=datasources/jdbc-driver=#{resource[:name]}:remove" + compiledcmd = "/profile=full-ha/#{cmd}" + bringDownName = 'JDBC-Driver' + + expect(provider).to receive(:compilecmd).with(cmd).and_return(compiledcmd) + expect(provider).to receive(:bringDown).with(bringDownName, compiledcmd).and_return(true) + end + + subject { provider.destroy } + it { expect(subject).to eq(true) } + end + + describe 'exists?' do + before :each do + cmd = "/subsystem=datasources/jdbc-driver=#{resource[:name]}:read-resource(recursive=true)" + compiledcmd = "/profile=full-ha/#{cmd}" + expected_output = { + :result => true, + } + + expect(provider).to receive(:compilecmd).with(cmd).and_return(compiledcmd) + expect(provider).to receive(:executeAndGet).with(compiledcmd).and_return(expected_output) + end + + subject { provider.exists? } + it { expect(subject).to eq(true)} + end + +end +end diff --git a/spec/unit/provider/jboss_jmsqueue/jbosscli_spec.rb b/spec/unit/provider/jboss_jmsqueue/jbosscli_spec.rb new file mode 100644 index 0000000..d3bfb2b --- /dev/null +++ b/spec/unit/provider/jboss_jmsqueue/jbosscli_spec.rb @@ -0,0 +1,205 @@ +require "spec_helper" + +context "mocking default values" do + + let(:mock_values) do + { + :product => 'jboss-eap', + :version => '6.4.0.GA', + :controller => '127.0.0.1:9999', + } + end + + before :each do + Puppet_X::Coi::Jboss::Configuration.reset_config(mock_values) + end + + after :each do + Puppet_X::Coi::Jboss::Configuration.reset_config + end + + describe 'Puppet::Type::JBoss_jmsqueue::ProviderJbosscli' do + + let(:described_class) do + Puppet::Type.type(:jboss_jmsqueue).provider(:jbosscli) + end + let(:sample_repl) do + { + :name => 'app-mails', + :durable => true, + :ensure => 'present', + :entries => [ + 'queue/app-mails', + 'java:jboss/exported/jms/queue/app-mails', + ], + :profile => 'full-ha' + } + end + + let(:extended_repl) do + {} + end + + let(:resource) do + raw = sample_repl.merge(extended_repl) + raw[:provider] = described_class.name + + Puppet::Type.type(:jboss_jmsqueue).new(raw) + end + + let(:provider) do + resource.provider + end + + before :each do + allow(provider.class).to receive(:suitable?).and_return(true) + end + + describe '#create wth runasdomain? => true' do + before :each do + + + bringUpName = 'Extension - messaging' + bringUpNameSubsytem = 'Subsystem - messaging' + profile = resource[:profile] + cmd = "/extension=org.jboss.as.messaging:add()" + cmd2 = + execCMD = '/extension=org.jboss.as.messaging:read-resource()' + execCMD_expected_output = { + :result => false, + } + execCMD2 = '/extension=org.jboss.as.messaging:add()' + + # line 4 + expect(provider).to receive(:runasdomain?).and_return(true) + + # line 17 + expect(provider).to receive(:execute).with(execCMD).and_return(execCMD_expected_output) + + # line 18 + expect(provider).to receive(:bringUp).with(bringUpName, execCMD2).and_return(true) + + # line 20 + cmdCompile = '/subsystem=messaging' + compiledCMDSubsystem = '/profile=full-ha/subsystem=messaging' + expect(provider).to receive(:compilecmd).with(cmdCompile).and_return(compiledCMDSubsystem) + + # line 21 + execCMDSubsystem = "#{compiledCMDSubsystem}:read-resource()" + expect(provider).to receive(:execute).with(execCMDSubsystem).and_return(execCMD_expected_output) + + # line 22 + cmdSubsystem = "#{compiledCMDSubsystem}:add()" + expect(provider).to receive(:bringUp).with(bringUpNameSubsytem, cmdSubsystem).and_return(true) + + # line 24 + hornetCMD = '/subsystem=messaging/hornetq-server=default' + compiledHornetCMD = "/profile=full-ha/#{hornetCMD}" + execHornetCMD = "#{compiledHornetCMD}:read-resource()" + hornetBringUpName = 'Default HornetQ' + horneBringUpCMD = "#{compiledHornetCMD}:add()" + + expect(provider).to receive(:compilecmd).with(hornetCMD).and_return(compiledHornetCMD) + expect(provider).to receive(:execute).with(execHornetCMD).and_return(execCMD_expected_output) + expect(provider).to receive(:bringUp).with(hornetBringUpName, horneBringUpCMD).and_return(true) + + # line 28 + finalCMD = 'jms-queue --profile=full-ha add --queue-address=app-mails --entries=["queue/app-mails", "java:jboss/exported/jms/queue/app-mails"] --durable=true' + finalBringUpName = 'JMS Queue' + expect(provider).to receive(:bringUp).with(finalBringUpName, finalCMD).and_return(true) + + end + + subject { provider.create } + it {expect(subject).to eq(true)} + end + + describe '#destroy' do + before :each do + expect(provider).to receive(:runasdomain?).and_return(true) + cmd = "jms-queue --profile=#{resource[:profile]} remove --queue-address=#{resource[:name]}" + bringDownName = 'JMS Queue' + expect(provider).to receive(:bringDown).with(bringDownName, cmd).and_return(true) + end + + subject { provider.destroy } + it { expect(subject).to eq(true) } + end + + describe '#exists? with result => true' do + before :each do + $data = nil + cmd = "/subsystem=messaging/hornetq-server=default/jms-queue=#{resource[:name]}:read-resource()" + compiledCMD = "/profile=full-ha#{cmd}" + + expected_output = { + :result => true, + :data => 'asd', + } + + expect(provider).to receive(:compilecmd).with(cmd).and_return(compiledCMD) + expect(provider).to receive(:executeAndGet).with(compiledCMD).and_return(expected_output) + end + + subject { provider.exists? } + it { expect(subject).to eq(true) } + end + + describe '#exists? with result => false' do + before :each do + $data = nil + cmd = "/subsystem=messaging/hornetq-server=default/jms-queue=#{resource[:name]}:read-resource()" + compiledCMD = "/profile=full-ha#{cmd}" + + expected_output = { + :result => false, + :data => 'asd', + } + + expect(provider).to receive(:compilecmd).with(cmd).and_return(compiledCMD) + expect(provider).to receive(:executeAndGet).with(compiledCMD).and_return(expected_output) + end + + subject { provider.exists? } + it { expect(subject).to eq(false) } + end + + describe '#durable' do + before :each do + $data = { + 'durable' => 'true', + } + end + subject { provider.durable } + it { expect(subject).to eq("true") } + end + + describe '#durable = true' do + before :each do + expect(provider).to receive(:setattr).with('durable', "\"true\"").and_return(true) + end + subject { provider.durable = "true" } + it { expect(subject).to eq("true") } + end + + describe '#entries' do + before :each do + $data = { + 'entries' => 'asd', + } + end + subject { provider.entries } + it { expect(subject).to eq('asd') } + end + + describe "#entries with true" do + before :each do + entries = "[\"true\", \"false\"]" + expect(provider).to receive(:setattr).with('entries', entries).and_return("true") + end + + subject { provider.entries = ['true', 'false'] } + it { expect(subject).to eq (['true', 'false']) } + end +end +end diff --git a/spec/unit/provider/jboss_securitydomain/jbosscli_spec.rb b/spec/unit/provider/jboss_securitydomain/jbosscli_spec.rb new file mode 100644 index 0000000..f0d4bef --- /dev/null +++ b/spec/unit/provider/jboss_securitydomain/jbosscli_spec.rb @@ -0,0 +1,154 @@ +require "spec_helper" + +context "mocking default values" do + + let(:mock_values) do + { + :product => 'jboss-eap', + :version => '6.4.0.GA', + :controller => '127.0.0.1:9999', + } + end + + before :each do + Puppet_X::Coi::Jboss::Configuration.reset_config(mock_values) + end + + after :each do + Puppet_X::Coi::Jboss::Configuration.reset_config + end + + describe 'Puppet::Type::Jboss_securitydomain::ProviderJbosscli' do + + let(:described_class) do + Puppet::Type.type(:jboss_securitydomain).provider(:jbosscli) + end + let(:sample_repl) do + { + :name => 'testing', + :code => 'Database', + :codeflag => 'true', + :moduleoptions => { + 'principalsQuery' => 'select \'password\' from users u where u.login = ?', + 'hashUserPassword' => false, + }, + } + end + + let(:resource) do + raw = sample_repl.dup + raw[:provider] = described_class.name + Puppet::Type.type(:jboss_securitydomain).new(raw) + end + + let(:provider) do + resource.provider + end + + before :each do + allow(provider.class).to receive(:suitable?).and_return(true) + end + + describe '#create' do + before :each do + moduleoptions = 'hashUserPassword => "false",principalsQuery => "select \'password\' from users u where u.login = ?"' + + cmd = "/subsystem=security/security-domain=#{resource[:name]}/authentication=classic:add(login-modules=[{code=>\"#{resource[:code]}\",flag=>\"#{resource[:codeflag]}\",module-options=>[#{moduleoptions}]}])" + compilecmd = "/profile=full-ha/#{cmd}" + + cmd2 = "/subsystem=security/security-domain=#{resource[:name]}:add(cache-type=default)" + compilecmd2 = "/profile=full-ha/#{cmd2}" + + expect(provider).to receive(:compilecmd).with(cmd).and_return(compilecmd) + expect(provider).to receive(:compilecmd).with(cmd2).and_return(compilecmd2) + + bringUpName = 'Security Domain Cache Type' + bringUpName2 = 'Security Domain' + expected_output = { :result => 'asdfhagfgaskfagbfjbgk' } + expected_output2 = { :result => 'dffghbdfnmkbsdkj' } + + + expect(provider).to receive(:bringUp).with(bringUpName, compilecmd2).and_return(expected_output) + expect(provider).to receive(:bringUp).with(bringUpName2, compilecmd).and_return(expected_output) + end + subject { provider.create } + it {expect(subject).to eq('asdfhagfgaskfagbfjbgk') } + end + + describe '#destroy' do + before :each do + cmd = "/subsystem=security/security-domain=#{resource[:name]}:remove()" + compilecmd = "/profile=full-ha/#{cmd}" + + bringDownName = 'Security Domain' + expected_output = { :result => 'asda'} + + expect(provider).to receive(:compilecmd).with(cmd).and_return(compilecmd) + expect(provider).to receive(:bringDown).with(bringDownName, compilecmd).and_return(expected_output) + end + subject { provider.destroy } + it { expect(subject).to eq('asda') } + end + + describe '#exist?' do + before :each do + cmd = "/subsystem=security/security-domain=#{resource[:name]}/authentication=classic:read-resource()" + compilecmd = "/profile=full-ha/#{cmd}" + + lines = 'asd' + + bringDownName = 'Security Domain' + content = <<-eos + { + "rolesQuery" => "select r.name, 'Roles' from users u join user_roles ur on ur.user_id = u.id join roles r on r.id = ur.role_id where u.login = ?", + "hashStorePassword" => "false", + "principalsQuery" => "select 'haslo' from uzytkownik u where u.login = upper(?)", + "hashUserPassword" => "false", + "dsJndiName" => "java:jboss/datasources/datasources_auth" + } + eos + + expected_lines = <<-eos + { + "outcome" => "success", + "result" => { + "login-modules" => [{ + "code" => "Database", + "flag" => "required", + "module" => undefined, + "module-options" => #{content} + }], + "login-module" => {"Database" => undefined} + } + } + eos + + expected_res = { + :cmd => compilecmd, + :result => res_result, + :lines => expected_lines + } + + expect(provider).to receive(:compilecmd).with(cmd).and_return(compilecmd) + expect(provider).to receive(:executeWithoutRetry).with(compilecmd).and_return(expected_res) + end + + subject { provider.exists? } + + context 'with res[:result] => true and existinghash && givenhash are not nil' do + let(:res_result) { true } + + before :each do + expect(provider).to receive(:destroy).and_return(nil) + end + + it { expect(subject).to eq(false) } + end + + context 'with [:result] => false' do + let(:res_result) { false } + it { expect(subject).to eq(false) } + end + end +end +end diff --git a/spec/unit/types/jboss_confignode_spec.rb b/spec/unit/types/jboss_confignode_spec.rb new file mode 100644 index 0000000..9bae25f --- /dev/null +++ b/spec/unit/types/jboss_confignode_spec.rb @@ -0,0 +1,60 @@ +require 'spec_helper' + +describe 'jboss_confignode', :type => :type do + let(:described_class) { Puppet::Type.type(:jboss_confignode) } + subject { described_class } + let(:ex_class) { if Puppet.version > '3.0.0' then Puppet::ResourceError else Puppet::Error end } + + def extend_params(given) + { + :title => '/sybsystem=datasources' + }.merge(given) + end + + let(:type) { described_class.new(params) } + let(:params) { extend_params({}) } + describe 'new type with title == /sybsystem=datasources' do + it { expect(type).not_to be_nil } + describe 'controller == :undef' do + let(:params) { extend_params({ :controller => :undef }) } + it { expect { type }.to raise_error(ex_class, 'Parameter controller failed on Jboss_confignode[/sybsystem=datasources]: Domain controller must be provided') } + end + + describe 'properties' do + let(:params) { extend_params({ :properties => properties }) } + describe 'munge' do + context 'not respond_to? :[]' do + let(:properties) { false } + subject { type.property :properties } + its(:value) { is_expected.to eq({}) } + end + context 'respond_to? :[]' do + let(:properties) { {'example' => false} } + subject { type.property :properties } + its(:value) { is_expected.to eq(properties) } + end + end + + describe 'change_to_s' do + let(:properties) { false } + subject { type.property(:properties).change_to_s(from, to) } + context 'from :absent and to hash', :from => :absent, :to => { 'alice' => 'five', 'bob' => 'seven' } do + let(:from) { |expl| expl.metadata[:from] } + let(:to) { |expl| expl.metadata[:to] } + it { expect(subject).to eq("property 'alice' has been set to \"five\", property 'bob' has been set to \"seven\"") } + end + context 'from hash and to changed hash', :from => { 'alice' => 'five', 'bob' => 'nine' }, :to => { 'alice' => 'five', 'bob' => 'seven' } do + let(:from) { |expl| expl.metadata[:from] } + let(:to) { |expl| expl.metadata[:to] } + it { expect(subject).to eq("property 'bob' has changed from \"nine\" to \"seven\"") } + end + context 'from hash and to :absent', :from => { 'alice' => 'five', 'bob' => 'nine' }, :to => :absent do + let(:from) { |expl| expl.metadata[:from] } + let(:to) { |expl| expl.metadata[:to] } + it { expect(subject).to eq("property 'alice' was \"five\" and has been removed, property 'bob' was \"nine\" and has been removed") } + end + end + end + end + +end diff --git a/spec/unit/types/jboss_datasource_spec.rb b/spec/unit/types/jboss_datasource_spec.rb index 329aab9..01d1906 100644 --- a/spec/unit/types/jboss_datasource_spec.rb +++ b/spec/unit/types/jboss_datasource_spec.rb @@ -159,7 +159,7 @@ def extend_params(given) 'Parameter options failed on Jboss_datasource[spec-datasource]: You can pass only hash-like objects or absent and undef values, given true') end end - context 'given' do + context 'display changes via change_to_s(from, to) using' do let(:options) { {} } subject { type.property(:options).change_to_s(from, to) } context 'from :absent and to hash', :from => :absent, :to => { 'alice' => 'five', 'bob' => 'seven' } do @@ -178,6 +178,23 @@ def extend_params(given) it { expect(subject).to eq('option \'alice\' was "five" and has been removed, option \'bob\' was "nine" and has been removed') } end end + + context 'munge new values using' do + let(:options) { {} } + subject { type.property(:options).munge(new_values) } + context 'regular hash' do + let(:new_values) { { 'alice' => 'five', 'bob' => 'seven' } } + it { expect(subject).to eq({ 'alice' => 'five', 'bob' => 'seven' }) } + end + context 'hash with :undef\'s' do + let(:new_values) { { 'alice' => :undef, 'bob' => 'seven' } } + it { expect(subject).to eq({ 'alice' => nil, 'bob' => 'seven' }) } + end + context 'an :undef\'s' do + let(:new_values) { :undef } + it { expect(subject).to eq(:undef) } + end + end end end diff --git a/spec/unit/types/jboss_deploy_spec.rb b/spec/unit/types/jboss_deploy_spec.rb new file mode 100644 index 0000000..c8c2236 --- /dev/null +++ b/spec/unit/types/jboss_deploy_spec.rb @@ -0,0 +1,32 @@ +require 'spec_helper' + +describe 'jboss_deploy', :type => :type do + let(:described_class) { Puppet::Type.type(:jboss_deploy) } + subject { described_class } + it { expect(subject).not_to be_nil } + let(:ex_class) { if Puppet.version > '3.0.0' then Puppet::ResourceError else Puppet::Error end } + + def extend_params(given) + { + :title => 'spec-artifact' + }.merge(given) + end + + let(:type) { described_class.new(params) } + + context 'no parameters given' do + let(:params) { extend_params({}) } + it { expect(type).not_to be_nil } + end + + describe 'controler' do + context 'given :undef' do + let(:params) { extend_params({ :controller => :undef }) } + it do + expect { type }.to raise_error(ex_class, + 'Parameter controller failed on Jboss_deploy[spec-artifact]: Domain controller must be provided') + end + end + end + +end diff --git a/spec/unit/types/jboss_jmsqueue_spec.rb b/spec/unit/types/jboss_jmsqueue_spec.rb new file mode 100644 index 0000000..5793d64 --- /dev/null +++ b/spec/unit/types/jboss_jmsqueue_spec.rb @@ -0,0 +1,45 @@ +require "spec_helper" + +describe 'jboss_jmsqueue', :type => :type do + let(:described_class) { Puppet::Type.type(:jboss_jmsqueue) } + subject { described_class } + it { expect(subject).not_to be_nil } + let(:ex_class) { if Puppet.version > '3.0.0' then Puppet::ResourceError else Puppet::Error end } + + def extend_params(given) + { + :title => 'spec-jmsqueue_spec' + }.merge(given) + end + + let(:type) { described_class.new(params) } + + describe 'controller' do + context 'given :undef' do + let(:params) { extend_params({ :controller => :undef }) } + it do + expect { type }.to raise_error(ex_class, + 'Parameter controller failed on Jboss_jmsqueue[spec-jmsqueue_spec]: Domain controller must be provided') + end + end + end + + describe 'entries' do + context 'is_to_s' do + let(:entries) { [ 'queue/app-mails', 'java:jboss/exported/jms/queue/app-mails'] } + let(:params) { extend_params({ :entries => entries }) } + let(:property) { type.property(:entries) } + it do + expect(property.is_to_s(entries)).to eq( "[\"queue/app-mails\", \"java:jboss/exported/jms/queue/app-mails\"]" ) + end + end + context 'should_to_s' do + let(:entries) { [ 'queue/app-mails', 'java:jboss/exported/jms/queue/app-mails'] } + let(:params) { extend_params({ :entries => entries }) } + let(:property) { type.property(:entries) } + it do + expect(property.should_to_s(entries)).to eq( "[\"queue/app-mails\", \"java:jboss/exported/jms/queue/app-mails\"]" ) + end + end + end +end diff --git a/spec/unit/types/jboss_resourceadapter_spec.rb b/spec/unit/types/jboss_resourceadapter_spec.rb new file mode 100644 index 0000000..ee25a55 --- /dev/null +++ b/spec/unit/types/jboss_resourceadapter_spec.rb @@ -0,0 +1,26 @@ +require "spec_helper" + +describe 'jboss_resourceadapter', :type => :type do + let(:described_class) { Puppet::Type.type(:jboss_resourceadapter) } + subject { described_class } + it { expect(subject).not_to be_nil } + let(:ex_class) { if Puppet.version > '3.0.0' then Puppet::ResourceError else Puppet::Error end } + + def extend_params(given) + { + :title => 'spec-resourceadapter_spec' + }.merge(given) + end + + let(:type) { described_class.new(params) } + + describe 'controler' do + context 'given :undef' do + let(:params) { extend_params({ :controller => :undef }) } + it do + expect { type }.to raise_error(ex_class, + 'Parameter controller failed on Jboss_resourceadapter[spec-resourceadapter_spec]: Domain controller must be provided') + end + end + end +end diff --git a/spec/unit/types/jboss_securitydomain_spec.rb b/spec/unit/types/jboss_securitydomain_spec.rb new file mode 100644 index 0000000..684f757 --- /dev/null +++ b/spec/unit/types/jboss_securitydomain_spec.rb @@ -0,0 +1,28 @@ +require "spec_helper" + +describe 'jboss_securitydomain', :type => :type do + let(:described_class) { Puppet::Type.type(:jboss_securitydomain) } + subject { described_class } + it { expect(subject).not_to be_nil } + + + let(:ex_class) { if Puppet.version > '3.0.0' then Puppet::ResourceError else Puppet::Error end } + + def extend_params(given) + { + :title => 'spec-resourceadapter_spec' + }.merge(given) + end + + let(:type) { described_class.new(params) } + + describe 'controler' do + context 'given :undef' do + let(:params) { extend_params({ :controller => :undef }) } + it do + expect { type }.to raise_error(ex_class, + 'Parameter controller failed on Jboss_securitydomain[spec-resourceadapter_spec]: Domain controller must be provided') + end + end + end +end diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 0000000..06ca814 --- /dev/null +++ b/tests/README.md @@ -0,0 +1,10 @@ +# Puppet smoke tests folder + +This folder contains standard Puppet smoke tests that can be run with + +``` +puppet apply tests/nameoffile.pp --noop +``` + +All files should execute without any problems, except for those in folder `tests/examples/`. +Examples in that folder require additional resources such as files or wars and we consider that placing them in repository is bad habit. If you want to run tests provide files via for example wget or some other technique. diff --git a/tests/clientry.pp b/tests/clientry.pp new file mode 100644 index 0000000..9e20391 --- /dev/null +++ b/tests/clientry.pp @@ -0,0 +1,8 @@ +include jboss + +jboss::clientry { '/subsystem=messaging/hornetq-server=default': + ensure => 'present', + properties => { + 'security-enabled' => false, + } +} diff --git a/tests/deploy.pp b/tests/examples/deploy.pp similarity index 100% rename from tests/deploy.pp rename to tests/examples/deploy.pp diff --git a/tests/resourceadapter.pp b/tests/examples/resourceadapter.pp similarity index 75% rename from tests/resourceadapter.pp rename to tests/examples/resourceadapter.pp index 94556a1..ceffa73 100644 --- a/tests/resourceadapter.pp +++ b/tests/examples/resourceadapter.pp @@ -1,7 +1,8 @@ include jboss jboss::deploy { 'jca-filestore.rar': - path => '/usr/src/jca-filestore.rar', + path => '/usr/src/jca-filestore.rar', + require => JBoss::Resourceadapter['jca-filestore.rar'], } jboss::resourceadapter { 'jca-filestore.rar': @@ -9,5 +10,4 @@ transactionsupport => 'LocalTransaction', classname => 'org.example.jca.FileSystemConnectionFactory', jndiname => 'java:/jboss/jca/photos', - require => JBoss::Deploy['jca-filestore.rar'], -} \ No newline at end of file +} diff --git a/tests/init.pp b/tests/init.pp index de68dcc..af29d14 100644 --- a/tests/init.pp +++ b/tests/init.pp @@ -1 +1 @@ -class { 'jboss': } +include jboss diff --git a/tests/interface.pp b/tests/interface.pp index 57d30ea..b7797d2 100644 --- a/tests/interface.pp +++ b/tests/interface.pp @@ -1,6 +1,6 @@ include jboss -jboss::interface { 'public': +jboss::interface { 'public-additional': ensure => 'present', - inet_address => '192.168.5.33', -} \ No newline at end of file + inet_address => $::ipaddress, +}