roadworker 0.3.2 → 0.3.3

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.
@@ -15,7 +15,7 @@ module Roadworker
15
15
  class Tester
16
16
  include Roadworker::Log
17
17
 
18
- DEFAULT_NAMESERVERS = '8.8.8.8'
18
+ DEFAULT_NAMESERVERS = ['8.8.8.8', '8.8.4.4']
19
19
  ASTERISK_PREFIX = 'asterisk-of-wildcard'
20
20
 
21
21
  class << self
@@ -31,6 +31,7 @@ module Roadworker
31
31
 
32
32
  def test(dsl)
33
33
  records = fetch_records(dsl)
34
+ records_length = records.length
34
35
  failures = 0
35
36
  error_messages = []
36
37
  warning_messages = []
@@ -78,11 +79,40 @@ module Roadworker
78
79
 
79
80
  if record.dns_name
80
81
  # A(Alias)
81
- is_same = response.answer.all? {|a|
82
- query(a.value, 'PTR', warning_messages).answer.all? do |ptr|
83
- ptr.value =~ /\.compute\.amazonaws\.com\.\Z/
82
+ case record.dns_name.sub(/\.\Z/, '')
83
+ when /\.elb\.amazonaws\.com/i
84
+ is_same = response.answer.all? {|a|
85
+ query(a.value, 'PTR', warning_messages).answer.all? do |ptr|
86
+ ptr.value =~ /\.compute\.amazonaws\.com\.\Z/
87
+ end
88
+ }
89
+ when /\As3-website-(?:[^.]+)\.amazonaws\.com\Z/
90
+ response_answer_ip_1_2 = response.answer.map {|a| a.value.split('.').slice(0, 2) }.uniq
91
+
92
+ # try 3 times
93
+ is_same = (0...3).any? do |n|
94
+ unless n.zero?
95
+ sleep 3
96
+ log(:debug, 'Retry Check', :white, "#{name} #{type}")
97
+ end
98
+
99
+ dns_name_a = query(record.dns_name, 'A', warning_messages)
100
+ s3_website_endpoint_ips = dns_name_a.answer.map {|i| i.value }
101
+
102
+ !s3_website_endpoint_ips.empty? && s3_website_endpoint_ips.any? {|ip|
103
+ response_answer_ip_1_2.include?(ip.split('.').slice(0, 2))
104
+ }
84
105
  end
85
- }
106
+ when /\.cloudfront\.net\Z/
107
+ is_same = response.answer.all? {|a|
108
+ query(a.value, 'PTR', warning_messages).answer.all? do |ptr|
109
+ ptr.value =~ /\.cloudfront\.net\.\Z/
110
+ end
111
+ }
112
+ else
113
+ warning_messages << "#{name} #{type}: Cannot check `#{record.dns_name}`"
114
+ is_same = true
115
+ end
86
116
  else
87
117
  is_same = (expected_value == actual_value)
88
118
  end
@@ -158,7 +188,7 @@ module Roadworker
158
188
  log(:warn, "WARNING #{msg}", :intense_yellow)
159
189
  end
160
190
 
161
- [records.length, failures]
191
+ [records_length, failures]
162
192
  end
163
193
 
164
194
  private
@@ -3,30 +3,86 @@ require 'aws-sdk'
3
3
  module AWS
4
4
  class Route53
5
5
 
6
- def dns_name_to_alias_target(name)
7
- name = name.sub(/\.\Z/, '')
6
+ # http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
7
+ S3_WEBSITE_ENDPOINTS = {
8
+ 's3-website-us-east-1.amazonaws.com' => 'Z3AQBSTGFYJSTF',
9
+ 's3-website-us-west-2.amazonaws.com' => 'Z3BJ6K6RIION7M',
10
+ 's3-website-us-west-1.amazonaws.com' => 'Z2F56UZL2M1ACD',
11
+ 's3-website-eu-west-1.amazonaws.com' => 'Z1BKCTXD74EZPE',
12
+ 's3-website-ap-southeast-1.amazonaws.com' => 'Z3O0J2DXBE1FTB',
13
+ 's3-website-ap-southeast-2.amazonaws.com' => 'Z1WCIGYICN2BYD',
14
+ 's3-website-ap-northeast-1.amazonaws.com' => 'Z2M4EHUR26P7ZW',
15
+ 's3-website-sa-east-1.amazonaws.com' => 'Z7KQH4QJS55SO',
16
+ 's3-website-us-gov-west-1.amazonaws.com' => 'Z31GFT0UA1I2HV',
17
+ }
8
18
 
9
- unless name =~ /([^.]+)\.elb\.amazonaws.com\Z/i
10
- raise "Invalid DNS Name: #{name}"
19
+ # http://docs.aws.amazon.com/Route53/latest/APIReference/API_ChangeResourceRecordSets.html
20
+ CF_HOSTED_ZONE_ID = 'Z2FDTNDATAQYW2'
21
+
22
+ class << self
23
+ def dns_name_to_alias_target(name, hosted_zone_id, hosted_zone_name)
24
+ hosted_zone_name = hosted_zone_name.sub(/\.\Z/, '')
25
+ name = name.sub(/\.\Z/, '')
26
+
27
+ if name =~ /([^.]+)\.elb\.amazonaws.com\Z/i
28
+ region = $1.downcase
29
+ elb_dns_name_to_alias_target(name, region)
30
+ elsif (s3_hosted_zone_id = S3_WEBSITE_ENDPOINTS[name.downcase]) and name =~ /\As3-website-([^.]+)\.amazonaws\.com\Z/i
31
+ region = $1.downcase
32
+ s3_dns_name_to_alias_target(name, region, s3_hosted_zone_id)
33
+ elsif name =~ /\.cloudfront\.net\Z/i
34
+ cf_dns_name_to_alias_target(name)
35
+ elsif name =~ /\.#{Regexp.escape(hosted_zone_name)}\Z/i
36
+ this_hz_dns_name_to_alias_target(name, hosted_zone_id)
37
+ else
38
+ raise "Invalid DNS Name: #{name}"
39
+ end
11
40
  end
12
41
 
13
- region = $1.downcase
14
- elb = AWS::ELB.new(:region => region)
42
+ private
43
+
44
+ def elb_dns_name_to_alias_target(name, region)
45
+ elb = AWS::ELB.new(:region => region)
46
+
47
+ load_balancer = elb.load_balancers.find do |lb|
48
+ lb.dns_name == name
49
+ end
15
50
 
16
- load_balancer = elb.load_balancers.find do |lb|
17
- lb.dns_name == name
51
+ unless load_balancer
52
+ raise "Cannot find ELB: #{name}"
53
+ end
54
+
55
+ {
56
+ :hosted_zone_id => load_balancer.canonical_hosted_zone_name_id,
57
+ :dns_name => load_balancer.dns_name,
58
+ :evaluate_target_health => false, # XXX:
59
+ }
60
+ end
61
+
62
+ def s3_dns_name_to_alias_target(name, region, hosted_zone_id)
63
+ {
64
+ :hosted_zone_id => hosted_zone_id,
65
+ :dns_name => name,
66
+ :evaluate_target_health => false, # XXX:
67
+ }
18
68
  end
19
69
 
20
- unless load_balancer
21
- raise "Cannot find ELB: #{name}"
70
+ def cf_dns_name_to_alias_target(name)
71
+ {
72
+ :hosted_zone_id => CF_HOSTED_ZONE_ID,
73
+ :dns_name => name,
74
+ :evaluate_target_health => false, # XXX:
75
+ }
22
76
  end
23
77
 
24
- {
25
- :hosted_zone_id => load_balancer.canonical_hosted_zone_name_id,
26
- :dns_name => load_balancer.dns_name,
27
- :evaluate_target_health => false, # XXX:
28
- }
29
- end
78
+ def this_hz_dns_name_to_alias_target(name, hosted_zone_id)
79
+ {
80
+ :hosted_zone_id => hosted_zone_id,
81
+ :dns_name => name,
82
+ :evaluate_target_health => false, # XXX:
83
+ }
84
+ end
85
+ end # of class method
30
86
 
31
87
  end # Route53
32
88
  end # Roadworker
@@ -131,7 +131,7 @@ module Roadworker
131
131
  case attr
132
132
  when :dns_name
133
133
  attr = :alias_target
134
- value = @options.route53.dns_name_to_alias_target(value)
134
+ value = AWS::Route53.dns_name_to_alias_target(value, @hosted_zone.id, @hosted_zone.name || @options.hosted_zone_name)
135
135
  when :health_check
136
136
  attr = :health_check_id
137
137
  value = @options.health_checks.find_or_create(value)
@@ -242,7 +242,7 @@ module Roadworker
242
242
 
243
243
  def dns_name=(name)
244
244
  if name
245
- @resource_record_set.alias_target = @options.route53.dns_name_to_alias_target(name)
245
+ @resource_record_set.alias_target = AWS::Route53.dns_name_to_alias_target(name, @hosted_zone.id, @hosted_zone.name || @options.hosted_zone_name)
246
246
  else
247
247
  @resource_record_set.alias_target = nil
248
248
  end
@@ -1,5 +1,5 @@
1
1
  module Roadworker
2
- VERSION = "0.3.2"
2
+ VERSION = "0.3.3"
3
3
  end
4
4
 
5
5
  Version = Roadworker::VERSION
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roadworker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.3.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-08-07 00:00:00.000000000 Z
12
+ date: 2013-08-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: aws-sdk