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.
- data/lib/roadworker/dsl-tester.rb +36 -6
- data/lib/roadworker/route53-ext.rb +72 -16
- data/lib/roadworker/route53-wrapper.rb +2 -2
- data/lib/roadworker/version.rb +1 -1
- metadata +2 -2
@@ -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
|
-
|
82
|
-
|
83
|
-
|
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
|
-
[
|
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
|
-
|
7
|
-
|
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
|
-
|
10
|
-
|
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
|
-
|
14
|
-
|
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
|
-
|
17
|
-
|
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
|
-
|
21
|
-
|
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
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
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 =
|
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 =
|
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
|
data/lib/roadworker/version.rb
CHANGED
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.
|
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-
|
12
|
+
date: 2013-08-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: aws-sdk
|