Class: PuppetX::Puppetlabs::Aws

Inherits:
Puppet::Provider
  • Object
show all
Defined in:
lib/puppet_x/puppetlabs/aws.rb

Direct Known Subclasses

Puppet::Provider::Route53Record

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.autoscaling_client(region = default_region) ⇒ Object



99
100
101
# File 'lib/puppet_x/puppetlabs/aws.rb', line 99

def self.autoscaling_client(region = default_region)
  ::Aws::AutoScaling::Client.new(client_config(region))
end

.client_config(region) ⇒ Object



66
67
68
69
70
71
72
# File 'lib/puppet_x/puppetlabs/aws.rb', line 66

def self.client_config(region)
  config = {region: region, logger: logger}
  if ENV['PUPPET_AWS_PROXY'] and not ENV['PUPPET_AWS_PROXY'].empty?
    config[:http_proxy] = ENV['PUPPET_AWS_PROXY']
  end
  config
end

.cloudwatch_client(region = default_region) ⇒ Object



107
108
109
# File 'lib/puppet_x/puppetlabs/aws.rb', line 107

def self.cloudwatch_client(region = default_region)
  ::Aws::CloudWatch::Client.new(client_config(region))
end

.customer_gateway_name_from_id(region, gateway_id) ⇒ Object



197
198
199
200
201
202
203
204
205
206
207
208
# File 'lib/puppet_x/puppetlabs/aws.rb', line 197

def self.customer_gateway_name_from_id(region, gateway_id)
  ec2 = ec2_client(region)
  @customer_gateways ||= Hash.new do |h, key|
    h[key] = if key
      response = ec2.describe_customer_gateways(customer_gateway_ids: [key])
      name_from_tag(response.data.customer_gateways.first)
    else
      nil
    end
  end
  @customer_gateways[gateway_id]
end

.default_regionObject



38
39
40
# File 'lib/puppet_x/puppetlabs/aws.rb', line 38

def self.default_region
  ENV['AWS_REGION'] || 'eu-west-1'
end

.ec2_client(region = default_region) ⇒ Object



74
75
76
# File 'lib/puppet_x/puppetlabs/aws.rb', line 74

def self.ec2_client(region = default_region)
  ::Aws::EC2::Client.new(client_config(region))
end

.elb_client(region = default_region) ⇒ Object



91
92
93
# File 'lib/puppet_x/puppetlabs/aws.rb', line 91

def self.elb_client(region = default_region)
  ::Aws::ElasticLoadBalancing::Client.new(client_config(region))
end

.gateway_name_from_id(region, gateway_id) ⇒ Object



236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
# File 'lib/puppet_x/puppetlabs/aws.rb', line 236

def self.gateway_name_from_id(region, gateway_id)
  ec2 = ec2_client(region)
  @gateways ||= Hash.new do |h, key|
    h[key] = if key == 'local'
      'local'
    else
      begin
        igw_response = ec2.describe_internet_gateways(internet_gateway_ids: [key])
        name_from_tag(igw_response.data.internet_gateways.first)
      rescue ::Aws::EC2::Errors::InvalidInternetGatewayIDNotFound
        begin
          vgw_response = ec2.describe_vpn_gateways(vpn_gateway_ids: [key])
          name_from_tag(vgw_response.data.vpn_gateways.first)
        rescue ::Aws::EC2::Errors::InvalidVpnGatewayIDNotFound
          nil
        end
      end
    end
  end
  @gateways[gateway_id]
end

.has_name?(hash) ⇒ Boolean

Returns:

  • (Boolean)


163
164
165
# File 'lib/puppet_x/puppetlabs/aws.rb', line 163

def self.has_name?(hash)
  !hash[:name].nil? && !hash[:name].empty?
end

.loggerObject



58
59
60
61
62
63
64
# File 'lib/puppet_x/puppetlabs/aws.rb', line 58

def self.logger
  if ENV['PUPPET_AWS_DEBUG_LOG'] and not ENV['PUPPET_AWS_DEBUG_LOG'].empty?
    Logger.new('puppet-aws-debug.log')
  else
    nil
  end
end

.name_from_tag(item) ⇒ Object



136
137
138
139
# File 'lib/puppet_x/puppetlabs/aws.rb', line 136

def self.name_from_tag(item)
  name_tag = item.tags.detect { |tag| tag.key == 'Name' }
  name_tag ? name_tag.value : nil
end

.options_name_from_id(region, options_id) ⇒ Object



223
224
225
226
227
228
229
230
231
232
233
234
# File 'lib/puppet_x/puppetlabs/aws.rb', line 223

def self.options_name_from_id(region, options_id)
  ec2 = ec2_client(region)
  @dhcp_options ||= Hash.new do |h, key|
    h[key] = unless key.nil? || key.empty?
      response = ec2.describe_dhcp_options(dhcp_options_ids: [key])
      name_from_tag(response.dhcp_options.first)
    else
      nil
    end
  end
  @dhcp_options[options_id]
end

.rds_client(region = default_region) ⇒ Object



127
128
129
# File 'lib/puppet_x/puppetlabs/aws.rb', line 127

def self.rds_client(region = default_region)
  ::Aws::RDS::Client.new({region: region})
end

.read_only(*methods) ⇒ Object



50
51
52
53
54
55
56
# File 'lib/puppet_x/puppetlabs/aws.rb', line 50

def self.read_only(*methods)
  methods.each do |method|
    define_method("#{method}=") do |v|
      fail "#{method} property is read-only once #{resource.type} created."
    end
  end
end

.regionsObject



26
27
28
29
30
31
32
# File 'lib/puppet_x/puppetlabs/aws.rb', line 26

def self.regions
  if ENV['AWS_REGION'] and not ENV['AWS_REGION'].empty?
    [ENV['AWS_REGION']]
  else
    ec2_client(default_region).describe_regions.data.regions.map(&:region_name)
  end
end

.route53_client(region = default_region) ⇒ Object



115
116
117
# File 'lib/puppet_x/puppetlabs/aws.rb', line 115

def self.route53_client(region = default_region)
  ::Aws::Route53::Client.new(client_config(region))
end

.security_group_name_from_id(region, group_id) ⇒ Object



184
185
186
187
188
189
190
191
192
193
194
195
# File 'lib/puppet_x/puppetlabs/aws.rb', line 184

def self.security_group_name_from_id(region, group_id)
  ec2 = ec2_client(region)
  @groups ||= Hash.new do |h, key|
    h[key] = if key
      response = ec2.describe_security_groups(group_ids: [key])
      response.data.security_groups.first.group_name
    else
      nil
    end
  end
  @groups[group_id]
end

.tags_for(item) ⇒ Object



141
142
143
144
145
146
147
# File 'lib/puppet_x/puppetlabs/aws.rb', line 141

def self.tags_for(item)
  tags = {}
  item.tags.each do |tag|
    tags[tag.key] = tag.value unless tag.key == 'Name'
  end
  tags
end

.vpc_name_from_id(region, vpc_id) ⇒ Object



167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
# File 'lib/puppet_x/puppetlabs/aws.rb', line 167

def self.vpc_name_from_id(region, vpc_id)
  ec2 = ec2_client(region)
  @vpcs ||= Hash.new do |h, key|
    h[key] = if key
      response = ec2.describe_vpcs(vpc_ids: [key])
      if response.data.vpcs.first.to_hash.keys.include?(:group_name)
        response.data.vpcs.first.group_name
      elsif response.data.vpcs.first.to_hash.keys.include?(:tags)
        name_from_tag(response.data.vpcs.first)
      end
    else
      nil
    end
  end
  @vpcs[vpc_id]
end

.vpn_gateway_name_from_id(region, gateway_id) ⇒ Object



210
211
212
213
214
215
216
217
218
219
220
221
# File 'lib/puppet_x/puppetlabs/aws.rb', line 210

def self.vpn_gateway_name_from_id(region, gateway_id)
  ec2 = ec2_client(region)
  @vpn_gateways ||= Hash.new do |h, key|
    h[key] = if key
      response = ec2.describe_vpn_gateways(vpn_gateway_ids: [key])
      name_from_tag(response.data.vpn_gateways.first)
    else
      nil
    end
  end
  @vpn_gateways[gateway_id]
end

Instance Method Details

#autoscaling_client(region = default_region) ⇒ Object



103
104
105
# File 'lib/puppet_x/puppetlabs/aws.rb', line 103

def autoscaling_client(region = default_region)
  self.class.autoscaling_client(region)
end

#cloudwatch_client(region = default_region) ⇒ Object



111
112
113
# File 'lib/puppet_x/puppetlabs/aws.rb', line 111

def cloudwatch_client(region = default_region)
  self.class.cloudwatch_client(region)
end

#default_regionObject



42
43
44
# File 'lib/puppet_x/puppetlabs/aws.rb', line 42

def default_region
  self.class.default_region
end

#ec2_client(region = default_region) ⇒ Object



78
79
80
# File 'lib/puppet_x/puppetlabs/aws.rb', line 78

def ec2_client(region = default_region)
  self.class.ec2_client(region)
end

#elb_client(region = default_region) ⇒ Object



95
96
97
# File 'lib/puppet_x/puppetlabs/aws.rb', line 95

def elb_client(region = default_region)
  self.class.elb_client(region)
end

#rds_client(region = default_region) ⇒ Object



123
124
125
# File 'lib/puppet_x/puppetlabs/aws.rb', line 123

def rds_client(region = default_region)
  self.class.rds_client(region)
end

#regionsObject



34
35
36
# File 'lib/puppet_x/puppetlabs/aws.rb', line 34

def regions
  self.class.regions
end

#route53_client(region = default_region) ⇒ Object



119
120
121
# File 'lib/puppet_x/puppetlabs/aws.rb', line 119

def route53_client(region = default_region)
  self.class.route53_client(region)
end

#tags=(value) ⇒ Object



149
150
151
152
153
154
155
156
157
158
159
160
161
# File 'lib/puppet_x/puppetlabs/aws.rb', line 149

def tags=(value)
  Puppet.info("Updating tags for #{name} in region #{target_region}")
  ec2 = ec2_client(target_region)
  ec2.create_tags(
    resources: [@property_hash[:id]],
    tags: value.collect { |k,v| { :key => k, :value => v } }
  ) unless value.empty?
  missing_tags = tags.keys - value.keys
  ec2.delete_tags(
    resources: [@property_hash[:id]],
    tags: missing_tags.collect { |k| { :key => k } }
  ) unless missing_tags.empty?
end

#tags_for_resourceObject



131
132
133
134
# File 'lib/puppet_x/puppetlabs/aws.rb', line 131

def tags_for_resource
  tags = resource[:tags] ? resource[:tags].map { |k,v| {key: k, value: v} } : []
  tags << {key: 'Name', value: name}
end

#target_regionObject



46
47
48
# File 'lib/puppet_x/puppetlabs/aws.rb', line 46

def target_region
  resource ? resource[:region] || region : region
end

#vpc_only_account?Boolean

Returns:

  • (Boolean)


82
83
84
85
86
87
88
89
# File 'lib/puppet_x/puppetlabs/aws.rb', line 82

def vpc_only_account?
  response = ec2_client.(
    attribute_names: ['supported-platforms']
  )

   = response..map(&:attribute_values).flatten.map(&:attribute_value)
   == ['VPC']
end