Class: Chef::Knife::RdsPgFromDataBag

Inherits:
Chef::Knife show all
Includes:
RdsBase, RdsBaseDataBag
Defined in:
lib/chef/knife/rds_pg_from_data_bag.rb

Constant Summary

Constants included from RdsBase

Chef::Knife::RdsBase::APPLY_METHODS

Instance Method Summary collapse

Methods included from RdsBaseDataBag

#assert_data_bag_exists!, #assert_data_bag_item_exists!, #assert_data_bag_item_valid!, #assert_required_data_bag_options_present!, #data_bag_exists?, #data_bag_item, #defined_params, included, #required_data_bag_options

Methods included from RdsBase

#assert_name_args_at_least!, #assert_valid_apply_method!, #authenticate!, #connect!, included, #rds

Instance Method Details

#assign_parameters_to_db_parameter_group!(apply_method = 'pending-reboot') ⇒ Object

Assigns all of data bag parameters to the parameter group AWS API support a maximum of 20 parameters updated in one call



97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/chef/knife/rds_pg_from_data_bag.rb', line 97

def assign_parameters_to_db_parameter_group!(apply_method = 'pending-reboot')
  params = []
  data_bag_item['parameters'].each do |k, v|
    ui.info("Assigning #{k} with value #{v}")
    params << {parameter_name: k, parameter_value: v.to_s, apply_method: apply_method}
    if params.length == 20
      modify_db_parameter_group_with_params!(params)
      params = []
    end
  end
  modify_db_parameter_group_with_params!(params) unless params.empty?
end

#create_db_parameter_group!Object

Create a new RDS Parameter group using the provideda data bag



122
123
124
125
126
127
128
# File 'lib/chef/knife/rds_pg_from_data_bag.rb', line 122

def create_db_parameter_group!
  rds.client.create_db_parameter_group(
    db_parameter_group_name: db_parameter_group_name,
    db_parameter_group_family: data_bag_item['db_parameter_group_family'],
    description: data_bag_item['description']
  )
end

#data_bag_item_nameObject

For use with base data bag module.



138
139
140
# File 'lib/chef/knife/rds_pg_from_data_bag.rb', line 138

def data_bag_item_name
  db_parameter_group_name
end

#db_parameter_groupObject

Load the DB Parameter Group resource from AWS using the API

Returns AWS::RDS::DBParameterGroup or nil



145
146
147
148
149
150
151
152
153
154
# File 'lib/chef/knife/rds_pg_from_data_bag.rb', line 145

def db_parameter_group
  unless @db_parameter_group
    begin
      @db_parameter_group = rds.client.describe_db_parameter_groups(db_parameter_group_name: db_parameter_group_name)
    rescue AWS::RDS::Errors::DBParameterGroupNotFound
      @db_parameter_group = nil
    end
    @db_parameter_group
  end
end

#db_parameter_group_nameObject

The name of the database parameter group, extracted from name arguments

Returns string



133
134
135
# File 'lib/chef/knife/rds_pg_from_data_bag.rb', line 133

def db_parameter_group_name
  name_args.first
end

#modify_db_parameter_group_with_params!(params = []) ⇒ Object

Modify the parameters of an existing RDS Parameter Group



111
112
113
114
115
116
117
118
119
# File 'lib/chef/knife/rds_pg_from_data_bag.rb', line 111

def modify_db_parameter_group_with_params!(params = [])
  begin
    rds.client.modify_db_parameter_group(db_parameter_group_name: db_parameter_group_name, parameters: params)
  rescue AWS::RDS::Errors::InvalidParameterValue => e
    ui.error "Unable to update this batch parameter values. Please check that your parameters are correct."
    ui.error "#{params.collect { |p| p[:parameter_name] }.join(', ') } not updated."
    ui.error "#{e.message}"
  end
end

#reset_parameters_from_db_parameter_group!(apply_method) ⇒ Object

Revoke custom db parameters from this group that are not present in data bag Check the parameters with soure = ‘user’ that exist on parameter group. If they are NOT in data bag, use reset API call to roll back to defaults



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/chef/knife/rds_pg_from_data_bag.rb', line 67

def reset_parameters_from_db_parameter_group!(apply_method)
  # Params to reset
  reset_params = []
  # Get user sources
  user_params = rds.client.describe_db_parameters(db_parameter_group_name: db_parameter_group_name, source: 'user')
  user_params[:parameters].each do |p|
    param_name = p[:parameter_name]
    unless data_bag_item['parameters'].keys.include?(param_name)
      ui.info "Revoking #{param_name}"
      reset_params << { parameter_name: param_name, apply_method: apply_method }
      if reset_params.length == 20
        reset_parameters_with_params!(reset_params)
        reset_params = []
      end
    else
      ui.info "Keeping #{param_name}"
    end
  end
  reset_parameters_with_params!(reset_params) unless reset_params.empty?
end

#reset_parameters_with_params!(params = []) ⇒ Object

Reset specified parameters in parameter group back to defaults

params - Array of hashes of format APPLY_METHOD, name: PARAMETER_NAME



91
92
93
# File 'lib/chef/knife/rds_pg_from_data_bag.rb', line 91

def reset_parameters_with_params!(params = [])
  rds.client.reset_db_parameter_group(db_parameter_group_name: db_parameter_group_name, parameters: params)
end

#runObject



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/chef/knife/rds_pg_from_data_bag.rb', line 30

def run

  assert_name_args_at_least!(1, "Parameter group name is required!")

  assert_data_bag_item_valid!

  assert_valid_apply_method!

  authenticate!

  # Check if exists parameter groups exists. If not, ask to create, and assign parameters
  if db_parameter_group.nil?
    ui.info("The parameter group #{db_parameter_group_name} does not exist.")
    confirm("Would you like to create it")
    create_db_parameter_group!
    apply_method = 'immediate'
  else
    ui.info("The parameter group #{db_parameter_group_name} exists.")
    confirm("Would you like to update #{db_parameter_group_name} with apply method #{config[:apply_method]}")
    apply_method = config[:apply_method]
  end

  # Reset user parameters no longer present in data bag
  # Values will be rolled back to default
  reset_parameters_from_db_parameter_group!(apply_method)
  # Assign the parameters to the parameter group
  assign_parameters_to_db_parameter_group!(apply_method)

  # Success
  ui.info("Assigned parameters to #{db_parameter_group_name}")
  exit 0

end