X-Git-Url: https://git.openstreetmap.org/chef.git/blobdiff_plain/6bf5013e5d298962c5a54bc395b53a5ec1a8a5ba..84f17c000a6997b9736011730c5764b09921c6f7:/cookbooks/postgresql/resources/user.rb diff --git a/cookbooks/postgresql/resources/user.rb b/cookbooks/postgresql/resources/user.rb index 5cbb94d58..6aac6f289 100644 --- a/cookbooks/postgresql/resources/user.rb +++ b/cookbooks/postgresql/resources/user.rb @@ -17,14 +17,70 @@ # limitations under the License. # +require "shellwords" + default_action :create -actions :create, :drop +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 -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 +action_class do + def cluster + @cluster ||= OpenStreetMap::PostgreSQL.new(new_resource.cluster) + end +end