knife-rds 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,39 @@
1
+ require 'chef/knife/rds_base'
2
+
3
+ class Chef
4
+ class Knife
5
+ class RdsPgList < Knife
6
+
7
+ '''
8
+ List parameter groups.
9
+ '''
10
+
11
+ PARAMETER_GROUP_INFO = {
12
+ db_parameter_group_name: 'Name',
13
+ description: 'Description',
14
+ db_parameter_group_family: 'Family',
15
+ }
16
+
17
+ include Knife::RdsBase
18
+
19
+ banner 'knife rds pg list (args)'
20
+
21
+ def run
22
+ authenticate!
23
+ rds.client.describe_db_parameter_groups[:db_parameter_groups].each do |group|
24
+ present_parameter_group(group)
25
+ end
26
+ exit 1
27
+ end
28
+
29
+ def present_parameter_group(group)
30
+ ui.info '---'
31
+ PARAMETER_GROUP_INFO.each do |k, v|
32
+ ui.info("#{v} - #{group[k]}")
33
+ end
34
+ ui.info '---'
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,176 @@
1
+ require 'chef/knife/rds_base'
2
+
3
+ class Chef
4
+ class Knife
5
+ class RdsSgFromDataBag < Knife
6
+
7
+ '''
8
+ Create or update a security group from data bag configuration.
9
+ The security group you are creating MUST have a data bag entry on your Chef server.
10
+ The security group will be updated if it exists, or created if it does not.
11
+ '''
12
+
13
+ include Knife::RdsBase
14
+ include Knife::RdsBaseDataBag
15
+
16
+ option :data_bag_name,
17
+ :long => '--data-bag-name DATA_BAG_NAME',
18
+ :description => 'Name of databag containing RDS instances',
19
+ :default => 'rds_security_groups'
20
+
21
+ require_in_data_bag :ip_addresses, :ec2_security_groups, :description
22
+
23
+ banner 'knife rds sg from data_bag PG_NAME (args)'
24
+
25
+ def run
26
+
27
+ assert_name_args_at_least!(1, "Security group name is required!")
28
+
29
+ assert_data_bag_item_valid!
30
+
31
+ authenticate!
32
+
33
+ if db_security_group.nil?
34
+ ui.info("The security group #{db_security_group_name} does not exist.")
35
+ confirm("Would you like to create it")
36
+ create_db_security_group!
37
+ else
38
+ ui.info "The security group #{db_security_group_name} exists. Continuing..."
39
+ end
40
+
41
+ ui.info "Revoking parameters"
42
+ revoke_parameters_from_db_security_group!
43
+ ui.info "Authorizing parameters."
44
+ authorize_parameters_to_db_security_group!
45
+
46
+ ui.info("Assigned parameters to #{db_security_group_name}")
47
+ exit 0
48
+
49
+ end
50
+
51
+ def aws_account_id
52
+ ENV['AWS_ACCOUNT_ID']
53
+ end
54
+
55
+ # Assign all parameters from data bag to security group
56
+ def authorize_parameters_to_db_security_group!
57
+ authorize_ec2_security_groups_to_db_security_group!
58
+ authorize_ip_addresses_to_db_security_group!
59
+ end
60
+
61
+ # Remove all parameters NOT in data bag from security group
62
+ def revoke_parameters_from_db_security_group!
63
+ revoke_ec2_security_groups_from_security_group!
64
+ revoke_ip_addresses_from_db_security_group!
65
+ end
66
+
67
+ # Revoke ip addresses belonging to group by NOT in data bag
68
+ def revoke_ip_addresses_from_db_security_group!
69
+ db_security_group[:db_security_groups].first[:ip_ranges].each do |ip|
70
+ cidr = ip[:cidrip]
71
+ unless data_bag_item['ip_addresses'].include?(cidr)
72
+ if ip[:status] == 'authorized'
73
+ ui.info "Revoking access for #{cidr}"
74
+ rds.client.revoke_db_security_group_ingress(
75
+ db_security_group_name: db_security_group_name,
76
+ cidrip: cidr
77
+ )
78
+ end
79
+ else
80
+ ui.info "Keeping #{cidr}"
81
+ end
82
+ end
83
+ end
84
+
85
+ # Revoke security groups that are not in the data bag
86
+ def revoke_ec2_security_groups_from_security_group!
87
+ db_security_group[:db_security_groups].first[:ec2_security_groups].each do |eg|
88
+ eg_name = eg[:ec2_security_group_name]
89
+ unless data_bag_item['ec2_security_groups'].include?(eg_name)
90
+ if eg[:status] == 'authorized'
91
+ ui.info "Revoking access for #{eg_name}"
92
+ rds.client.revoke_db_security_group_ingress(
93
+ db_security_group_name: db_security_group_name,
94
+ ec2_security_group_owner_id: aws_account_id,
95
+ ec2_security_group_name: eg_name
96
+ )
97
+ end
98
+ else
99
+ ui.info "Keeping #{eg_name}"
100
+ end
101
+ end
102
+ end
103
+
104
+
105
+ # assign ec2 security groups
106
+ # aws account id is REQUIRED. Currently, it must be exported as environment variable
107
+ def authorize_ec2_security_groups_to_db_security_group!
108
+ data_bag_item['ec2_security_groups'].each do |group|
109
+ begin
110
+ rds.client.authorize_db_security_group_ingress(
111
+ db_security_group_name: db_security_group_name,
112
+ ec2_security_group_owner_id: aws_account_id,
113
+ ec2_security_group_name: group
114
+ )
115
+ ui.info "#{group} applied"
116
+ rescue AWS::RDS::Errors::AuthorizationAlreadyExists => e
117
+ ui.info "#{group} already applied"
118
+ end
119
+ end
120
+ end
121
+
122
+ # Assign ip addresses to security group
123
+ def authorize_ip_addresses_to_db_security_group!
124
+ data_bag_item['ip_addresses'].each do |ip|
125
+ begin
126
+ rds.client.authorize_db_security_group_ingress(
127
+ db_security_group_name: db_security_group_name,
128
+ cidrip: ip
129
+ )
130
+ rescue AWS::RDS::Errors::InvalidParameterValue => e
131
+ ui.info "Error applying ip #{ip}."
132
+ ui.info e.message
133
+ rescue AWS::RDS::Errors::AuthorizationAlreadyExists => e
134
+ ui.info "#{ip} already applied."
135
+ end
136
+
137
+ end
138
+ end
139
+
140
+ # Create a new RDS Security group using the provideda data bag
141
+ def create_db_security_group!
142
+ rds.client.create_db_security_group(
143
+ db_security_group_name: db_security_group_name,
144
+ db_security_group_description: data_bag_item['description']
145
+ )
146
+ end
147
+
148
+ # The name of the database security group, extracted from name arguments
149
+ #
150
+ # Returns string
151
+ def db_security_group_name
152
+ name_args.first
153
+ end
154
+
155
+ # For use with base data bag module.
156
+ def data_bag_item_name
157
+ db_security_group_name
158
+ end
159
+
160
+ # Load the DB Parameter Group resource from AWS using the API
161
+ #
162
+ # Returns AWS::RDS::DBParameterGroup or nil
163
+ def db_security_group
164
+ unless @db_security_group
165
+ begin
166
+ @db_security_group = rds.client.describe_db_security_groups(db_security_group_name: db_security_group_name)
167
+ rescue AWS::RDS::Errors::DBSecurityGroupNotFound => e
168
+ @db_security_group = nil
169
+ end
170
+ end
171
+ @db_security_group
172
+ end
173
+
174
+ end
175
+ end
176
+ end
@@ -0,0 +1,37 @@
1
+ require 'chef/knife/rds_base'
2
+
3
+ class Chef
4
+ class Knife
5
+ class RdsSgList < Knife
6
+
7
+ '''
8
+ List security groups.
9
+ '''
10
+
11
+ SECURITY_GROUP_INFO = {
12
+ db_security_group_name: 'Name'
13
+ }
14
+
15
+ include Knife::RdsBase
16
+
17
+ banner 'knife rds sg list (args)'
18
+
19
+ def run
20
+ authenticate!
21
+ rds.client.describe_db_security_groups[:db_security_groups].each do |sg|
22
+ present_security_group(sg)
23
+ end
24
+ exit 1
25
+ end
26
+
27
+ def present_security_group(group)
28
+ ui.info '---'
29
+ SECURITY_GROUP_INFO.each do |k, v|
30
+ ui.info("#{v} - #{group[k]}")
31
+ end
32
+ ui.info '---'
33
+ end
34
+
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,5 @@
1
+ module Knife
2
+ module RDS
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1 @@
1
+ # TODO
metadata ADDED
@@ -0,0 +1,178 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: knife-rds
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jason Byck
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-05-15 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: chef
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 11.4.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 11.4.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: aws-sdk
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rspec
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: '2.14'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '2.14'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rake
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: '10.1'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '10.1'
78
+ - !ruby/object:Gem::Dependency
79
+ name: fakeweb
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: pry
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: rubocop
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ description: Manage RDS
127
+ email:
128
+ - jbyck@quandl.com
129
+ executables: []
130
+ extensions: []
131
+ extra_rdoc_files: []
132
+ files:
133
+ - .gitignore
134
+ - Gemfile
135
+ - Gemfile.lock
136
+ - LICENSE
137
+ - README.md
138
+ - bin/console
139
+ - knife-rds.gemspec
140
+ - lib/chef/knife/rds_base.rb
141
+ - lib/chef/knife/rds_base_data_bag.rb
142
+ - lib/chef/knife/rds_create.rb
143
+ - lib/chef/knife/rds_instance_delete.rb
144
+ - lib/chef/knife/rds_instance_from_data_bag.rb
145
+ - lib/chef/knife/rds_instance_list.rb
146
+ - lib/chef/knife/rds_instance_restore_from_data_bag.rb
147
+ - lib/chef/knife/rds_pg_from_data_bag.rb
148
+ - lib/chef/knife/rds_pg_list.rb
149
+ - lib/chef/knife/rds_sg_from_data_bag.rb
150
+ - lib/chef/knife/rds_sg_list.rb
151
+ - lib/knife-rds/version.rb
152
+ - spec/spec_helper.rb
153
+ homepage: https://github.com/quandl/knife-rds
154
+ licenses: []
155
+ post_install_message:
156
+ rdoc_options: []
157
+ require_paths:
158
+ - lib
159
+ required_ruby_version: !ruby/object:Gem::Requirement
160
+ none: false
161
+ requirements:
162
+ - - ! '>='
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ required_rubygems_version: !ruby/object:Gem::Requirement
166
+ none: false
167
+ requirements:
168
+ - - ! '>='
169
+ - !ruby/object:Gem::Version
170
+ version: '0'
171
+ requirements: []
172
+ rubyforge_project:
173
+ rubygems_version: 1.8.23
174
+ signing_key:
175
+ specification_version: 3
176
+ summary: Manage RDS
177
+ test_files:
178
+ - spec/spec_helper.rb