roadworker 0.3.2 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -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