newer pg module
[mirror/dsa-puppet.git] / 3rdparty / modules / postgresql / lib / puppet / util / postgresql_validator.rb
diff --git a/3rdparty/modules/postgresql/lib/puppet/util/postgresql_validator.rb b/3rdparty/modules/postgresql/lib/puppet/util/postgresql_validator.rb
new file mode 100644 (file)
index 0000000..d737f12
--- /dev/null
@@ -0,0 +1,65 @@
+module Puppet
+  module Util
+    class PostgresqlValidator
+      attr_reader :resource
+
+      def initialize(resource)
+        @resource = resource
+      end
+
+      def build_psql_cmd
+        final_cmd = []
+
+        cmd_init = "#{@resource[:psql_path]} --tuples-only --quiet --no-psqlrc"
+
+        final_cmd.push cmd_init
+
+        cmd_parts = {
+          :host => "--host #{@resource[:host]}",
+          :port => "--port #{@resource[:port]}",
+          :db_username => "--username #{@resource[:db_username]}",
+          :db_name => "--dbname #{@resource[:db_name]}",
+          :command => "--command '#{@resource[:command]}'"
+        }
+
+        cmd_parts.each do |k,v|
+          final_cmd.push v if @resource[k]
+        end
+
+        final_cmd.join ' '
+      end
+
+      def parse_connect_settings
+        c_settings = @resource[:connect_settings] || {}
+        c_settings.merge! ({ 'PGPASSWORD' => @resource[:db_password] }) if @resource[:db_password]
+        return c_settings.map { |k,v| "#{k}=#{v}" }
+      end
+
+      def attempt_connection(sleep_length, tries)
+        (0..tries-1).each do |try|
+          Puppet.debug "PostgresqlValidator.attempt_connection: Attempting connection to #{@resource[:db_name]}"
+          Puppet.debug "PostgresqlValidator.attempt_connection: #{build_validate_cmd}"
+          result = execute_command
+          if result && result.length > 0
+            Puppet.debug "PostgresqlValidator.attempt_connection: Connection to #{@resource[:db_name] || parse_connect_settings.select { |elem| elem.match /PGDATABASE/ }} successful!"
+            return true
+          else
+            Puppet.warning "PostgresqlValidator.attempt_connection: Sleeping for #{sleep_length} seconds"
+            sleep sleep_length
+          end
+        end
+        false
+      end
+
+      private
+
+      def execute_command
+        Execution.execute(build_validate_cmd, :uid => @resource[:run_as])
+      end
+
+      def build_validate_cmd
+        "#{parse_connect_settings.join(' ')} #{build_psql_cmd} "
+      end
+    end
+  end
+end