X-Git-Url: https://git.openstreetmap.org./chef.git/blobdiff_plain/faf8ae12e85eabb050b0f5eceb2cb67ad1de5261..204605749875101d3316aa94917d0a4b6c055fb3:/cookbooks/postgresql/resources/user.rb diff --git a/cookbooks/postgresql/resources/user.rb b/cookbooks/postgresql/resources/user.rb index f5fefa35a..6aac6f289 100644 --- a/cookbooks/postgresql/resources/user.rb +++ b/cookbooks/postgresql/resources/user.rb @@ -17,17 +17,70 @@ # limitations under the License. # -actions :create, :drop - -attribute :user, :kind_of => String, :name_attribute => true -attribute :cluster, :kind_of => String, :required => true -attribute :password, :kind_of => String -attribute :superuser, :default => false -attribute :createdb, :default => false -attribute :createrole, :default => false -attribute :replication, :default => false - -def initialize(*args) - super - @action = :create +require "shellwords" + +default_action :create + +property :user, :kind_of => String, :name_attribute => true +property :cluster, :kind_of => String, :required => true +property :password, :kind_of => String +property :superuser, :default => false +property :createdb, :default => false +property :createrole, :default => false +property :replication, :default => false + +action :create do + password = new_resource.password ? "ENCRYPTED PASSWORD '#{new_resource.password.shellescape}'" : "" + superuser = new_resource.superuser ? "SUPERUSER" : "NOSUPERUSER" + createdb = new_resource.createdb ? "CREATEDB" : "NOCREATEDB" + createrole = new_resource.createrole ? "CREATEROLE" : "NOCREATEROLE" + replication = new_resource.replication ? "REPLICATION" : "NOREPLICATION" + + if !cluster.users.include?(new_resource.user) + converge_by "create role #{new_resource.user}" do + cluster.execute(:command => "CREATE ROLE \"#{new_resource.user}\" LOGIN #{password} #{superuser} #{createdb} #{createrole}") + end + else + current_user = cluster.users[new_resource.user] + + if new_resource.superuser != current_user[:superuser] + converge_by "alter role #{new_resource.user}" do + cluster.execute(:command => "ALTER ROLE \"#{new_resource.user}\" #{superuser}") + end + end + + unless new_resource.superuser + if new_resource.createdb != current_user[:createdb] + converge_by "alter role #{new_resource.user}" do + cluster.execute(:command => "ALTER ROLE \"#{new_resource.user}\" #{createdb}") + end + end + + if new_resource.createrole != current_user[:createrole] + converge_by "alter role #{new_resource.user}" do + cluster.execute(:command => "ALTER ROLE \"#{new_resource.user}\" #{createrole}") + end + end + + if new_resource.replication != current_user[:replication] + converge_by "alter role #{new_resource.user}" do + cluster.execute(:command => "ALTER ROLE \"#{new_resource.user}\" #{replication}") + end + end + end + end +end + +action :drop do + if cluster.users.include?(new_resource.user) + converge_by "drop role #{new_resource.user}" do + cluster.execute(:command => "DROP ROLE \"#{new_resource.user}\"") + end + end +end + +action_class do + def cluster + @cluster ||= OpenStreetMap::PostgreSQL.new(new_resource.cluster) + end end