rdstune 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. checksums.yaml +7 -0
  2. data/bin/rdstune +25 -0
  3. data/contributors.txt +1 -0
  4. data/lib/rdstune.rb +100 -0
  5. data/license.txt +14 -0
  6. metadata +90 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1b52b36f88c883294a27357da6f5742af119b4da
4
+ data.tar.gz: 3e42dc290d91bbe12d3731e50ebeea432219ac90
5
+ SHA512:
6
+ metadata.gz: 77f2b8c02ce388f81ad9bccf74ace1fe1d9223108d4f0cbb3bec401b7657c4e9f868690408cc023e9b8513c9fc097be09b8dbbf16f3760db7002ff199dc4de3a
7
+ data.tar.gz: 4dcb2c6fad861405aa9a50f0c00fc57ab6f4888dae680bb6ed17b0b57f0ed18aa6c2a3f72488c0ba5ac08c3f53308c92bd5715a1c9e6d1461aa327eaffe65224
data/bin/rdstune ADDED
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rdstune'
4
+ require 'trollop'
5
+
6
+ p = Trollop::Parser.new do
7
+ opt :type, "Type of Database Server (Web/DW/Mixed/Desktop)", :type => :string, :default => 'web'
8
+ opt :memory, "Amount of Memory on the Server (GiB)", :type => :float
9
+ opt :connections, "Specify the Target Max Connections", :type => :integer
10
+ opt :name, "Name of your RDS Parameter Group", :type => :string
11
+ opt :family, "Database Family (Postgres version)", :type => :string, :default => 'postgres9.3'
12
+ end
13
+
14
+ opts = Trollop::with_standard_exception_handling p do
15
+ o = p.parse ARGV
16
+ if o[:memory] == nil or o[:connections] == nil
17
+ raise Trollop::HelpNeeded
18
+ end
19
+ o
20
+ end
21
+
22
+ name = opts[:name] || "rdstune-#{opts[:type]}-#{opts[:memory]}-#{opts[:connections]}".gsub('.','-')
23
+ rdstune = RdsTune.new opts[:type], opts[:memory], { 'connections' => opts[:connections] }
24
+ rdstune.create_parameter_group name, opts[:family]
25
+ rdstune.display_config
data/contributors.txt ADDED
@@ -0,0 +1 @@
1
+ David Kerr
data/lib/rdstune.rb ADDED
@@ -0,0 +1,100 @@
1
+ require 'aws-sdk'
2
+ require 'mrtuner'
3
+
4
+
5
+ class RdsTune < MrTuner
6
+
7
+ def initialize(type, memory, options={})
8
+ @rds = AWS::RDS::Client.new
9
+ @type = type
10
+ @memory = memory
11
+ @options = options
12
+ super(@type, @memory, @options)
13
+ end
14
+
15
+ def create_parameter_group(name = nil, family = nil)
16
+ abort("Please Specify a Parameter Group Name: #{name} or Family: #{family}") unless name && family
17
+ group_name = name
18
+ group_family = family
19
+ unless find_parameter_group(group_name)
20
+ @rds.create_db_parameter_group({
21
+ :db_parameter_group_name => group_name,
22
+ :db_parameter_group_family => group_family,
23
+ :description => "Created by RdsTune - #{@type} - #{@memory} - #{Time.now.to_s}"
24
+ })
25
+ end
26
+ update_parameter_group(group_name)
27
+ end
28
+
29
+ private
30
+ def update_parameter_group(group_name)
31
+ begin
32
+ @rds.modify_db_parameter_group({
33
+ :db_parameter_group_name => group_name,
34
+ :parameters => generate_update(group_name)
35
+ })
36
+ puts "Group #{group_name } created."
37
+ return group_name
38
+ rescue AWS::RDS::Errors::InvalidDBParameterGroupState
39
+ abort("Parameter group not updateable at this time " + AWS::RDS::Errors::InvalidDBParameterGroupState)
40
+ end
41
+ end
42
+
43
+ def generate_update(group_name)
44
+ parameters = get_all_parameters(group_name)
45
+ new_config = get_config
46
+ out = Array.new
47
+ new_config.each do |p, v|
48
+ parameter = get_parameter(p.to_s, parameters)
49
+ low,high = parameter[:allowed_values].split('-')
50
+
51
+ # Convert Bytes to Kibibytes for Memory parameters
52
+ v = v / 1024 if ['work_mem','maintenance_work_mem','shared_buffers','effective_cache_size'].include?(parameter[:parameter_name])
53
+
54
+ case parameter[:data_type]
55
+ when 'float'
56
+ v = low if v.to_f < low.to_f
57
+ v = high if v.to_f > high.to_f
58
+ parameter[:parameter_value] = v.to_f.to_s
59
+ when 'integer'
60
+ v = low if v.to_f < low.to_f
61
+ v = high if v.to_f > high.to_f
62
+ parameter[:parameter_value] = v.to_i.to_s
63
+ end
64
+
65
+ if parameter[:apply_type] == 'dynamic'
66
+ parameter[:apply_method] = 'immediate'
67
+ else
68
+ parameter[:apply_method] = 'pending-reboot'
69
+ end
70
+ out.push(parameter)
71
+ end
72
+ out
73
+ end
74
+
75
+ def get_all_parameters(group_name)
76
+ marker = ""
77
+ parameters = []
78
+ loop do
79
+ resp = @rds.describe_db_parameters( :db_parameter_group_name => group_name, :marker => marker)
80
+ parameters += resp[:parameters]
81
+ marker = resp[:marker]
82
+ break unless marker
83
+ end
84
+ parameters
85
+ end
86
+
87
+ def find_parameter_group(name)
88
+ begin
89
+ @rds.describe_db_parameter_groups( { :db_parameter_group_name => name } )
90
+ rescue AWS::RDS::Errors::DBParameterGroupNotFound
91
+ nil
92
+ end
93
+ end
94
+
95
+ def get_parameter(name, parameters)
96
+ parameters.select {|parameter| parameter[:parameter_name] == name}.first
97
+ end
98
+
99
+
100
+ end
data/license.txt ADDED
@@ -0,0 +1,14 @@
1
+ License
2
+
3
+ rdstune is licensed under a standard 3-clause BSD license.
4
+ Copyright (c) 2014, David Kerr All rights reserved.
5
+
6
+ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
7
+
8
+ Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
9
+
10
+ Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
11
+
12
+ Neither the name of the author nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission.
13
+
14
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
metadata ADDED
@@ -0,0 +1,90 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rdstune
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.0
5
+ platform: ruby
6
+ authors:
7
+ - David Kerr
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-01-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: aws-sdk
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.51'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.51'
27
+ - !ruby/object:Gem::Dependency
28
+ name: trollop
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: mrtuner
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.5'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.5'
55
+ description: Generates a useful base configuration for PostgreSQL in RDS
56
+ email: dave@davidmerr.com
57
+ executables:
58
+ - rdstune
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - bin/rdstune
63
+ - contributors.txt
64
+ - lib/rdstune.rb
65
+ - license.txt
66
+ homepage: https://bitbucket.org/davidkerr/rdstune
67
+ licenses:
68
+ - BSD
69
+ metadata: {}
70
+ post_install_message:
71
+ rdoc_options: []
72
+ require_paths:
73
+ - lib
74
+ required_ruby_version: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ required_rubygems_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ requirements: []
85
+ rubyforge_project:
86
+ rubygems_version: 2.4.1
87
+ signing_key:
88
+ specification_version: 4
89
+ summary: Creates Tuned RDS Parameter Group for Postgres
90
+ test_files: []