smart_proxy_dns_route53 2.0.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: afc68be7898dff76e610ac85e992e403f86d6c92
4
- data.tar.gz: e88894baa652431ea063b23287c9f9ff909da377
3
+ metadata.gz: cc34b8b1e28f0d113bc0ded31929bd925d863c70
4
+ data.tar.gz: 5ebc3509ec21c98e544e41cb577086deb13bf99a
5
5
  SHA512:
6
- metadata.gz: 64b97a5cbfd2150c4df89b57d86acc26b07c10cc4ca6f630f39533bbfe35ad3e417bf39e998f60b5ec64726fcd7319e5555b3ae05a62c8ca2bac5b11a86dc12b
7
- data.tar.gz: 39da40207db0a7083db676da32b085edb38b53c7a63f528a92638c5c4304521995d5e48cdc8210cdf70db5079b4805f4318cd5c64b6618f7eabac2b7fc7b8750
6
+ metadata.gz: c6bada1d5fca8a12dcdb9b7370ba933db54ac3b7a0cbb3d0d3f28f411066a312edfcba097806d9712a95ba20c9a89bfa3f0a3e458ce1ccd54e68a862d5006c52
7
+ data.tar.gz: f596aef91a3b5d0f858076ddcdba44beb539db647c9fdfa90435021279fc094c3ac91f7363957f51fc826ca957450b9a7558db6b5fd7cf5565a3a646758090a5
data/README.md CHANGED
@@ -12,7 +12,8 @@ for how to install Smart Proxy plugins
12
12
  | Smart Proxy Version | Plugin Version |
13
13
  | ------------------- | --------------:|
14
14
  | >= 1.10, < 1.11 | ~> 1.0 |
15
- | >= 1.11 | ~> 2.0 |
15
+ | >= 1.11, < 1.13 | ~> 2.0 |
16
+ | >= 1.13, < 1.15 | ~> 3.0 |
16
17
 
17
18
  ## Configuration
18
19
 
@@ -27,10 +28,60 @@ Configuration options for this plugin are in `/etc/foreman-proxy/settings.d/dns_
27
28
  * `:aws_access_key: "ABCDEF123456"` - set to be the Access Key ID of the IAM account
28
29
  * `:aws_secret_key: "ABCDEF123456!@#$"` - set to be the Secret Access Key of the IAM account
29
30
 
31
+ ### IAM policy
32
+
33
+ The IAM account must have the following actions associated via a policy:
34
+
35
+ * `route53:ListHostedZones` (all resources)
36
+ * `route53:ChangeResourceRecordSets` (on all zones being managed)
37
+ * `route53:ListResourceRecordSets` (on all zones being managed)
38
+
39
+ An example policy document follows:
40
+
41
+ ```json
42
+ {
43
+ "Version": "2012-10-17",
44
+ "Statement": [
45
+ {
46
+ "Sid": "Stmt1485852222000",
47
+ "Effect": "Allow",
48
+ "Action": [
49
+ "route53:ListHostedZones"
50
+ ],
51
+ "Resource": "*"
52
+ },
53
+ {
54
+ "Sid": "Stmt1485852222001",
55
+ "Effect": "Allow",
56
+ "Action": [
57
+ "route53:ChangeResourceRecordSets",
58
+ "route53:ListResourceRecordSets"
59
+ ],
60
+ "Resource": [
61
+ "arn:aws:route53:::hostedzone/Z1HNC9XBMDGFH9",
62
+ "arn:aws:route53:::hostedzone/Z2MCBLVJI24XOO",
63
+ "arn:aws:route53:::hostedzone/Z5H8WZ62ARI5V"
64
+ ]
65
+ }
66
+ ]
67
+ }
68
+ ```
69
+
30
70
  ## Contributing
31
71
 
32
72
  Fork and send a Pull Request. Thanks!
33
73
 
74
+ ### Integration test
75
+
76
+ The integration test runs against the AWS Route 53 API, so requires IAM credentials. To run it locally, set up an IAM policy with actions described above, _plus_ the `route53:GetHostedZone` action.
77
+
78
+ Three zones must also be set up - a forward, reverse IPv4 and reverse IPv6 zone. The names do not matter. *All records will be deleted* in these zones when running the test, so do not use the zones for any other purpose.
79
+
80
+ Export the following environment variables:
81
+
82
+ * `AWS_ACCESS_KEY`, `AWS_SECRET_KEY` - per regular plugin configuration
83
+ * `AWS_FORWARD_ZONE`, `AWS_REVERSE_V4_ZONE`, `AWS_REVERSE_V6_ZONE` - zone names that will be under complete control of the test suite
84
+
34
85
  ## Copyright
35
86
 
36
87
  Copyright (c) 2015 Daniel Maraio, Sol Cates, Red Hat Inc. and other contributors
@@ -0,0 +1,16 @@
1
+ module ::Proxy::Dns::Route53
2
+ class PluginConfiguration
3
+ def load_classes
4
+ require 'smart_proxy_dns_plugin_template/dns_plugin_template_main'
5
+ end
6
+
7
+ def load_dependency_injection_wirings(container_instance, settings)
8
+ container_instance.dependency :dns_provider, (lambda do
9
+ ::Proxy::Dns::Route53::Record.new(
10
+ settings[:aws_access_key],
11
+ settings[:aws_secret_key],
12
+ settings[:dns_ttl])
13
+ end)
14
+ end
15
+ end
16
+ end
@@ -10,15 +10,18 @@ module Proxy::Dns::Route53
10
10
 
11
11
  attr_reader :aws_access_key, :aws_secret_key
12
12
 
13
- def initialize(a_server = nil, a_ttl = nil)
14
- @aws_access_key = Proxy::Dns::Route53::Plugin.settings.aws_access_key
15
- @aws_secret_key = Proxy::Dns::Route53::Plugin.settings.aws_secret_key
16
- super(a_server, a_ttl || ::Proxy::Dns::Plugin.settings.dns_ttl)
13
+ def initialize(aws_access_key, aws_secret_key, ttl = nil)
14
+ @aws_access_key = aws_access_key
15
+ @aws_secret_key = aws_secret_key
16
+ super(nil, ttl)
17
17
  end
18
18
 
19
19
  def create_a_record(fqdn, ip)
20
- if found = dns_find(fqdn)
21
- raise(Proxy::Dns::Collision, "#{fqdn} is already used by #{ip}") unless found == ip
20
+ case a_record_conflicts(fqdn, ip) #returns -1, 0, 1
21
+ when 1 then
22
+ raise(Proxy::Dns::Collision, "#{fqdn} is already used by #{ip}")
23
+ when 0 then
24
+ return nil
22
25
  else
23
26
  zone = get_zone(fqdn)
24
27
  new_record = Route53::DNSRecord.new(fqdn, 'A', ttl, [ip], zone)
@@ -28,12 +31,30 @@ module Proxy::Dns::Route53
28
31
  end
29
32
  end
30
33
 
31
- def create_ptr_record(fqdn, ip)
32
- if found = dns_find(ip)
33
- raise(Proxy::Dns::Collision, "#{ip} is already used by #{found}") unless found == fqdn
34
+ def create_aaaa_record(fqdn, ip)
35
+ case aaaa_record_conflicts(fqdn, ip) #returns -1, 0, 1
36
+ when 1 then
37
+ raise(Proxy::Dns::Collision, "#{fqdn} is already used by #{ip}")
38
+ when 0 then
39
+ return nil
34
40
  else
35
- zone = get_zone(ip)
36
- new_record = Route53::DNSRecord.new(ip, 'PTR', ttl, [fqdn], zone)
41
+ zone = get_zone(fqdn)
42
+ new_record = Route53::DNSRecord.new(fqdn, 'AAAA', ttl, [ip], zone)
43
+ resp = new_record.create
44
+ raise "AWS Response Error: #{resp}" if resp.error?
45
+ true
46
+ end
47
+ end
48
+
49
+ def create_ptr_record(fqdn, ptr)
50
+ case ptr_record_conflicts(fqdn, ptr_to_ip(ptr)) #returns -1, 0, 1
51
+ when 1 then
52
+ raise(Proxy::Dns::Collision, "#{ptr} is already in use")
53
+ when 0 then
54
+ return nil
55
+ else
56
+ zone = get_zone(ptr)
57
+ new_record = Route53::DNSRecord.new(ptr, 'PTR', ttl, [fqdn], zone)
37
58
  resp = new_record.create
38
59
  raise "AWS Response Error: #{resp}" if resp.error?
39
60
  true
@@ -44,7 +65,20 @@ module Proxy::Dns::Route53
44
65
  zone = get_zone(fqdn)
45
66
  recordset = zone.get_records
46
67
  recordset.each do |rec|
47
- if rec.name == fqdn + '.'
68
+ if rec.name == fqdn + '.' && rec.type == 'A'
69
+ resp = rec.delete
70
+ raise "AWS Response Error: #{resp}" if resp.error?
71
+ return true
72
+ end
73
+ end
74
+ raise Proxy::Dns::NotFound, "Could not find forward record #{fqdn}"
75
+ end
76
+
77
+ def remove_aaaa_record(fqdn)
78
+ zone = get_zone(fqdn)
79
+ recordset = zone.get_records
80
+ recordset.each do |rec|
81
+ if rec.name == fqdn + '.' && rec.type == 'AAAA'
48
82
  resp = rec.delete
49
83
  raise "AWS Response Error: #{resp}" if resp.error?
50
84
  return true
@@ -76,9 +110,14 @@ module Proxy::Dns::Route53
76
110
  @resolver ||= Resolv::DNS.new
77
111
  end
78
112
 
79
- def get_zone(fqdn)
80
- domain = fqdn.split('.', 2).last + '.'
81
- conn.get_zones(domain)[0]
113
+ def get_zone(name)
114
+ zones = conn.get_zones
115
+ name_arr = name.split('.')
116
+ (1 ... name_arr.size).each do |i|
117
+ search_domain = name_arr.last(name_arr.size - i).join('.') + "."
118
+ zone_select = zones.select { |z| z.name == search_domain }
119
+ return zone_select.first if zone_select.any?
120
+ end
82
121
  end
83
122
  end
84
123
  end
@@ -1,16 +1,15 @@
1
1
  require 'smart_proxy_dns_route53/dns_route53_version'
2
+ require 'smart_proxy_dns_route53/dns_route53_configuration'
2
3
 
3
4
  module Proxy::Dns::Route53
4
5
  class Plugin < ::Proxy::Provider
5
6
  plugin :dns_route53, ::Proxy::Dns::Route53::VERSION
6
7
 
7
- requires :dns, '>= 1.11'
8
+ requires :dns, '>= 1.13'
8
9
 
9
- validate_presence :aws_access_key, :aws_secret_key
10
+ default_settings :aws_access_key => nil, :aws_secret_key => nil
10
11
 
11
- after_activation do
12
- require 'smart_proxy_dns_route53/dns_route53_main'
13
- require 'smart_proxy_dns_route53/route53_dependencies'
14
- end
12
+ load_classes ::Proxy::Dns::Route53::PluginConfiguration
13
+ load_dependency_injection_wirings ::Proxy::Dns::Route53::PluginConfiguration
15
14
  end
16
15
  end
@@ -1,7 +1,7 @@
1
1
  module Proxy
2
2
  module Dns
3
3
  module Route53
4
- VERSION = '2.0.0'
4
+ VERSION = '3.0.0'
5
5
  end
6
6
  end
7
7
  end
@@ -0,0 +1,158 @@
1
+ require 'test_helper'
2
+
3
+ require 'smart_proxy_dns_route53/dns_route53_plugin'
4
+ require 'smart_proxy_dns_route53/dns_route53_main'
5
+
6
+ require 'dns/dependency_injection'
7
+
8
+ module Proxy::Dns
9
+ module DependencyInjection
10
+ include Proxy::DependencyInjection::Accessors
11
+ def container_instance
12
+ Proxy::DependencyInjection::Container.new do |c|
13
+ c.dependency :dns_provider, (lambda do
14
+ ::Proxy::Dns::Route53::Record.new(
15
+ ENV['AWS_ACCESS_KEY'],
16
+ ENV['AWS_SECRET_KEY'])
17
+ end)
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ require 'dns/dns_api'
24
+ require 'rack/test'
25
+ require 'resolv'
26
+
27
+ TestRecord = Struct.new(:ip, :type) do
28
+ alias_method :fqdn, :ip
29
+ end
30
+
31
+ class DnsRoute53IntegrationTest < Test::Unit::TestCase
32
+ include Rack::Test::Methods
33
+
34
+ def app
35
+ @app = Proxy::Dns::Api.new
36
+ end
37
+
38
+ def setup
39
+ omit_if(%w[AWS_ACCESS_KEY AWS_SECRET_KEY AWS_FORWARD_ZONE AWS_REVERSE_V4_ZONE AWS_REVERSE_V6_ZONE].any? { |e| !ENV.has_key?(e) })
40
+ clean_zones
41
+ @record = nil
42
+ end
43
+
44
+ def test_create_a_record
45
+ post '/', :fqdn => "test.#{forward_zone}", :value => '192.168.33.33', :type => 'A'
46
+ assert_equal 200, last_response.status
47
+ assert_equal '192.168.33.33', record(forward_zone, "test.#{forward_zone}.", 'A').ip
48
+ assert_equal 'A', @record.type
49
+ end
50
+
51
+ def test_create_ptr_v4_record
52
+ post '/', :fqdn => "test.#{forward_zone}.", :value => "33.#{reverse_v4_zone}", :type => 'PTR'
53
+ assert_equal 200, last_response.status
54
+ assert_equal "test.#{forward_zone}.", record(reverse_v4_zone, "33.#{reverse_v4_zone}.", 'PTR').fqdn
55
+ assert_equal 'PTR', @record.type
56
+ end
57
+
58
+ def test_create_ptr_v6_record
59
+ post '/', :fqdn => "test.#{forward_zone}.", :value => "1.#{reverse_v6_zone(true)}", :type => 'PTR'
60
+ assert_equal 200, last_response.status
61
+ assert_equal "test.#{forward_zone}.", record(reverse_v6_zone, "1.#{reverse_v6_zone(true)}.", 'PTR').fqdn
62
+ assert_equal 'PTR', @record.type
63
+ end
64
+
65
+ def test_create_aaaa_record
66
+ post '/', :fqdn => "test.#{forward_zone}", :value => '2001:db8::1', :type => 'AAAA'
67
+ assert_equal 200, last_response.status
68
+ assert_equal '2001:db8::1', record(forward_zone, "test.#{forward_zone}.", 'AAAA').ip
69
+ assert_equal 'AAAA', @record.type
70
+ end
71
+
72
+ def test_create_cname_record
73
+ omit 'CNAME support not implemented'
74
+ post '/', :fqdn => "test.#{forward_zone}", :value => 'test1.com', :type => 'CNAME'
75
+ assert_equal 200, last_response.status
76
+ assert_equal 'test1.com.', record(forward_zone, "test.#{forward_zone}.", 'CNAME').fqdn
77
+ assert_equal 'CNAME', @record.type
78
+ end
79
+
80
+ def test_delete_a_record
81
+ create_record forward_zone, "test.#{forward_zone}.", 'A', '3600', ['1.2.3.4']
82
+ delete "/test.#{forward_zone}"
83
+ assert_equal 200, last_response.status
84
+ assert_nil record(forward_zone, "test.#{forward_zone}.", 'A')
85
+ end
86
+
87
+ def test_delete_ptr_record
88
+ create_record reverse_v4_zone, "33.#{reverse_v4_zone}.", 'PTR', '3600', ['test.example.com.']
89
+ delete "/33.#{reverse_v4_zone}"
90
+ assert_equal 200, last_response.status
91
+ assert_nil record(reverse_v4_zone, "33.#{reverse_v4_zone}.", 'PTR')
92
+ end
93
+
94
+ def test_delete_aaaa_record
95
+ create_record forward_zone, "test.#{forward_zone}.", 'AAAA', '3600', ['2001:db8::1']
96
+ delete "/test.#{forward_zone}/AAAA"
97
+ assert_equal 200, last_response.status
98
+ assert_nil record(forward_zone, "test.#{forward_zone}.", 'AAAA')
99
+ end
100
+
101
+ def test_delete_explicit_cname_record
102
+ omit 'CNAME support not implemented'
103
+ create_record forward_zone, "test.#{forward_zone}.", 'CNAME', '3600', ['test.example.com.']
104
+ delete "/test.#{forward_zone}/CNAME"
105
+ assert_equal 200, last_response.status
106
+ assert_nil record(forward_zone, "test.#{forward_zone}.", 'CNAME')
107
+ end
108
+
109
+ private
110
+
111
+ def forward_zone
112
+ ENV['AWS_FORWARD_ZONE'].chomp('.')
113
+ end
114
+
115
+ def reverse_v4_zone
116
+ ENV['AWS_REVERSE_V4_ZONE'].chomp('.')
117
+ end
118
+
119
+ def reverse_v6_zone(pad = false)
120
+ zone = ENV['AWS_REVERSE_V6_ZONE'].chomp('.')
121
+ if pad
122
+ zeros = '0.' * ((62 - (reverse_v6_zone.length - 'ip6.arpa'.length)) / 2)
123
+ "#{zeros}#{zone}"
124
+ else
125
+ zone
126
+ end
127
+ end
128
+
129
+ def conn
130
+ @conn ||= Route53::Connection.new(ENV['AWS_ACCESS_KEY'], ENV['AWS_SECRET_KEY'])
131
+ end
132
+
133
+ def clean_zones
134
+ [forward_zone, reverse_v4_zone, reverse_v6_zone].each do |zone_name|
135
+ zone = conn.get_zones(zone_name)
136
+ raise "Cannot find AWS zone #{zone_name}" if zone.nil?
137
+ zone.first.get_records.each do |record|
138
+ next if %w[SOA NS].include?(record.type)
139
+ raise "AWS error while deleting #{record}: #{response}" if (response = record.delete).error?
140
+ end
141
+ end
142
+ end
143
+
144
+ def record(zone_name, name, type)
145
+ zone = conn.get_zones(zone_name)
146
+ raise "Cannot find AWS zone #{zone_name}" if zone.nil?
147
+ record = zone.first.get_records.find { |rec| rec.name == name && rec.type == type }
148
+ @record = record.nil? ? nil : TestRecord.new(record.values.first, record.type)
149
+ end
150
+
151
+ def create_record(zone_name, *record)
152
+ zone = conn.get_zones(zone_name)
153
+ raise "Cannot find AWS zone #{zone_name}" if zone.nil?
154
+ response = Route53::DNSRecord.new(*(record.push(zone.first))).create
155
+ raise "Failed to create test record #{record}: #{response}" if response.error?
156
+ record
157
+ end
158
+ end
@@ -4,141 +4,145 @@ require 'smart_proxy_dns_route53/dns_route53_plugin'
4
4
  require 'smart_proxy_dns_route53/dns_route53_main'
5
5
 
6
6
  class DnsRoute53RecordTest < Test::Unit::TestCase
7
+ def setup
8
+ @provider = Proxy::Dns::Route53::Record.new('foo', 'bar', 86400)
9
+ end
10
+
7
11
  # Test that correct initialization works
8
12
  def test_provider_initialization
9
- Proxy::Dns::Route53::Plugin.load_test_settings(:aws_access_key => 'foo', :aws_secret_key => 'bar')
10
- provider = klass.new
11
- assert_equal 'foo', provider.aws_access_key
12
- assert_equal 'bar', provider.aws_secret_key
13
+ assert_equal 'foo', @provider.aws_access_key
14
+ assert_equal 'bar', @provider.aws_secret_key
15
+ assert_equal 86400, @provider.ttl
13
16
  end
14
17
 
15
18
  # Test A record creation
16
19
  def test_create_a
17
- record = klass.new
18
- record.expects(:dns_find).returns(false)
20
+ @provider.expects(:a_record_conflicts).with('test.example.com', '10.1.1.1').returns(-1)
19
21
 
20
22
  zone = mock()
21
- record.expects(:get_zone).with('test.example.com').returns(zone)
23
+ @provider.expects(:get_zone).with('test.example.com').returns(zone)
22
24
 
23
25
  dnsrecord = mock(:create => mock(:error? => false))
24
26
  Route53::DNSRecord.expects(:new).with('test.example.com', 'A', 86400, ['10.1.1.1'], zone).returns(dnsrecord)
25
27
 
26
- assert record.create_a_record(fqdn, ip)
28
+ assert @provider.create_a_record(fqdn, ip)
27
29
  end
28
30
 
29
31
  # Test A record creation fails if the record exists
30
32
  def test_create_a_conflict
31
- record = klass.new
32
- record.expects(:dns_find).returns('10.2.2.2')
33
- assert_raise(Proxy::Dns::Collision) { record.create_a_record(fqdn, ip) }
33
+ @provider.expects(:a_record_conflicts).with(fqdn, ip).returns(1)
34
+ assert_raise(Proxy::Dns::Collision) { @provider.create_a_record(fqdn, ip) }
35
+ end
36
+
37
+ # Test AAAA record creation
38
+ def test_create_aaaaa
39
+ @provider.expects(:aaaa_record_conflicts).with('test.example.com', '2001:db8::1').returns(-1)
40
+
41
+ zone = mock()
42
+ @provider.expects(:get_zone).with('test.example.com').returns(zone)
43
+
44
+ dnsrecord = mock(:create => mock(:error? => false))
45
+ Route53::DNSRecord.expects(:new).with('test.example.com', 'AAAA', 86400, ['2001:db8::1'], zone).returns(dnsrecord)
46
+
47
+ assert @provider.create_aaaa_record(fqdn, '2001:db8::1')
48
+ end
49
+
50
+ # Test AAAA record creation fails if the record exists
51
+ def test_create_aaaa_conflict
52
+ @provider.expects(:aaaa_record_conflicts).with(fqdn, '2001:db8::1').returns(1)
53
+ assert_raise(Proxy::Dns::Collision) { @provider.create_aaaa_record(fqdn, '2001:db8::1') }
34
54
  end
35
55
 
36
56
  # Test PTR record creation
37
57
  def test_create_ptr
38
- record = klass.new
39
- record.expects(:dns_find).returns(false)
58
+ @provider.expects(:ptr_record_conflicts).with('test.example.com', '10.1.1.1').returns(false)
40
59
 
41
60
  zone = mock()
42
- record.expects(:get_zone).with('10.1.1.1').returns(zone)
61
+ @provider.expects(:get_zone).with('1.1.1.10.in-addr.arpa').returns(zone)
43
62
 
44
63
  dnsrecord = mock(:create => mock(:error? => false))
45
- Route53::DNSRecord.expects(:new).with('10.1.1.1', 'PTR', 86400, ['test.example.com'], zone).returns(dnsrecord)
64
+ Route53::DNSRecord.expects(:new).with('1.1.1.10.in-addr.arpa', 'PTR', 86400, ['test.example.com'], zone).returns(dnsrecord)
46
65
 
47
- assert record.create_ptr_record(fqdn, ip)
66
+ assert @provider.create_ptr_record(fqdn, '1.1.1.10.in-addr.arpa')
48
67
  end
49
68
 
50
69
  # Test PTR record creation fails if the record exists
51
70
  def test_create_ptr_conflict
52
- record = klass.new
53
- record.expects(:dns_find).returns('else.example.com')
54
- assert_raise(Proxy::Dns::Collision) { record.create_ptr_record(fqdn, ip) }
71
+ @provider.expects(:ptr_record_conflicts).with('test.example.com', '10.1.1.1').returns(1)
72
+ assert_raise(Proxy::Dns::Collision) { @provider.create_ptr_record(fqdn, '1.1.1.10.in-addr.arpa') }
55
73
  end
56
74
 
57
75
  # Test A record removal
58
76
  def test_remove_a
59
- zone = mock(:get_records => [mock(:name => 'test.example.com.', :delete => mock(:error? => false))])
60
- record = klass.new
61
- record.expects(:get_zone).with('test.example.com').returns(zone)
62
- assert record.remove_a_record(fqdn)
77
+ zone = mock(:get_records => [mock(:name => 'test.example.com.', :type => 'A', :delete => mock(:error? => false))])
78
+ @provider.expects(:get_zone).with('test.example.com').returns(zone)
79
+ assert @provider.remove_a_record(fqdn)
63
80
  end
64
81
 
65
82
  # Test A record removal fails if the record doesn't exist
66
83
  def test_remove_a_not_found
67
- record = klass.new
68
- record.expects(:get_zone).with('test.example.com').returns(mock(:get_records => []))
69
- assert_raise(Proxy::Dns::NotFound) { assert record.remove_a_record(fqdn) }
84
+ @provider.expects(:get_zone).with('test.example.com').returns(mock(:get_records => []))
85
+ assert_raise(Proxy::Dns::NotFound) { assert @provider.remove_a_record(fqdn) }
86
+ end
87
+
88
+ # Test AAAA record removal
89
+ def test_remove_aaaa
90
+ zone = mock(:get_records => [mock(:name => 'test.example.com.', :type => 'AAAA', :delete => mock(:error? => false))])
91
+ @provider.expects(:get_zone).with('test.example.com').returns(zone)
92
+ assert @provider.remove_aaaa_record(fqdn)
93
+ end
94
+
95
+ # Test A record removal fails if the record doesn't exist
96
+ def test_remove_a_not_found
97
+ @provider.expects(:get_zone).with('test.example.com').returns(mock(:get_records => []))
98
+ assert_raise(Proxy::Dns::NotFound) { assert @provider.remove_a_record(fqdn) }
70
99
  end
71
100
 
72
101
  # Test PTR record removal
73
102
  def test_remove_ptr
74
103
  # FIXME: record name seems incorrect for rDNS
75
104
  zone = mock(:get_records => [mock(:name => '10.1.1.1.', :delete => mock(:error? => false))])
76
- record = klass.new
77
- record.expects(:get_zone).with('10.1.1.1').returns(zone)
78
- assert record.remove_ptr_record(ip)
105
+ @provider.expects(:get_zone).with('10.1.1.1').returns(zone)
106
+ assert @provider.remove_ptr_record(ip)
79
107
  end
80
108
 
81
109
  # Test PTR record removal fails if the record doesn't exist
82
110
  def test_remove_ptr_not_found
83
- record = klass.new
84
- record.expects(:get_zone).with('10.1.1.1').returns(mock(:get_records => []))
85
- assert_raise(Proxy::Dns::NotFound) { assert record.remove_ptr_record(ip) }
111
+ @provider.expects(:get_zone).with('10.1.1.1').returns(mock(:get_records => []))
112
+ assert_raise(Proxy::Dns::NotFound) { assert @provider.remove_ptr_record(ip) }
86
113
  end
87
114
 
88
115
  def test_get_zone_forward
89
- record = klass.new
90
- conn = mock()
91
- conn.expects(:get_zones).with('example.com.').returns([:zone])
92
- record.expects(:conn).returns(conn)
93
- assert_equal :zone, record.send(:get_zone, 'test.example.com')
116
+ zone = stub(:name => 'example.com.')
117
+ conn = mock(:get_zones => [zone])
118
+ @provider.expects(:conn).returns(conn)
119
+ assert_equal zone, @provider.send(:get_zone, 'test.example.com.')
94
120
  end
95
121
 
96
122
  def test_get_zone_reverse
97
- record = klass.new
98
- conn = mock()
99
- conn.expects(:get_zones).with('1.1.1.').returns([:zone]) # FIXME, incorrect rDNS zone
100
- record.expects(:conn).returns(conn)
101
- assert_equal :zone, record.send(:get_zone, '10.1.1.1')
123
+ zone = stub(:name => '2.1.10.in-addr.arpa.')
124
+ conn = mock(:get_zones => [zone])
125
+ @provider.expects(:conn).returns(conn)
126
+ assert_equal zone, @provider.send(:get_zone, '3.2.1.10.in-addr.arpa.')
102
127
  end
103
128
 
104
- def test_dns_find_forward
105
- record = klass.new
106
- resolver = mock()
107
- resolver.expects(:getaddress).with('test.example.com').returns('10.1.1.1')
108
- record.expects(:resolver).returns(resolver)
109
- assert_equal '10.1.1.1', record.send(:dns_find, 'test.example.com')
129
+ def test_get_zone_reverse_v6
130
+ zone = stub(:name => '8.b.d.0.1.0.0.2.ip6.arpa.')
131
+ conn = mock(:get_zones => [zone])
132
+ @provider.expects(:conn).returns(conn)
133
+ assert_equal zone, @provider.send(:get_zone, '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.')
110
134
  end
111
135
 
112
- def test_dns_find_forward_not_found
113
- record = klass.new
114
- resolver = mock()
115
- resolver.expects(:getaddress).with('test.example.com').raises(Resolv::ResolvError)
116
- record.expects(:resolver).returns(resolver)
117
- refute record.send(:dns_find, 'test.example.com')
118
- end
119
-
120
- def test_dns_find_reverse
121
- record = klass.new
122
- resolver = mock()
123
- resolver.expects(:getname).with('3.2.1.10').returns('test.example.com')
124
- record.expects(:resolver).returns(resolver)
125
- assert_equal 'test.example.com', record.send(:dns_find, '10.1.2.3')
126
- end
127
-
128
- def test_dns_find_reverse_not_found
129
- record = klass.new
130
- resolver = mock()
131
- resolver.expects(:getname).with('3.2.1.10').raises(Resolv::ResolvError)
132
- record.expects(:resolver).returns(resolver)
133
- refute record.send(:dns_find, '10.1.2.3')
136
+ def test_get_zone_longest_match
137
+ zone = stub(:name => 'sub.example.com.')
138
+ other = stub(:name => 'example.com.')
139
+ conn = mock(:get_zones => [other, zone])
140
+ @provider.expects(:conn).returns(conn)
141
+ assert_equal zone, @provider.send(:get_zone, 'host.sub.example.com.')
134
142
  end
135
143
 
136
144
  private
137
145
 
138
- def klass
139
- Proxy::Dns::Route53::Record
140
- end
141
-
142
146
  def fqdn
143
147
  'test.example.com'
144
148
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smart_proxy_dns_route53
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Foreman developers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-15 00:00:00.000000000 Z
11
+ date: 2017-02-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: route53
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rack-test
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  description: Route 53 DNS provider plugin for Foreman's smart proxy
70
84
  email:
71
85
  - foreman-dev@googlegroups.com
@@ -78,15 +92,16 @@ files:
78
92
  - bundler.d/dns_route53.rb
79
93
  - config/dns_route53.yml
80
94
  - lib/smart_proxy_dns_route53.rb
95
+ - lib/smart_proxy_dns_route53/dns_route53_configuration.rb
81
96
  - lib/smart_proxy_dns_route53/dns_route53_main.rb
82
97
  - lib/smart_proxy_dns_route53/dns_route53_plugin.rb
83
98
  - lib/smart_proxy_dns_route53/dns_route53_version.rb
84
- - lib/smart_proxy_dns_route53/route53_dependencies.rb
99
+ - test/dns_route53_integration_test.rb
85
100
  - test/dns_route53_record_test.rb
86
101
  - test/test_helper.rb
87
102
  homepage: https://github.com/theforeman/smart_proxy_dns_route53
88
103
  licenses:
89
- - GPLv3
104
+ - GPL-3.0
90
105
  metadata: {}
91
106
  post_install_message:
92
107
  rdoc_options: []
@@ -104,10 +119,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
104
119
  version: '0'
105
120
  requirements: []
106
121
  rubyforge_project:
107
- rubygems_version: 2.2.1
122
+ rubygems_version: 2.6.8
108
123
  signing_key:
109
124
  specification_version: 4
110
125
  summary: Route 53 DNS provider plugin for Foreman's smart proxy
111
126
  test_files:
127
+ - test/dns_route53_integration_test.rb
112
128
  - test/dns_route53_record_test.rb
113
129
  - test/test_helper.rb
@@ -1,5 +0,0 @@
1
- require 'dns_common/dependency_injection/dependencies'
2
-
3
- class Proxy::Dns::DependencyInjection::Dependencies
4
- dependency :dns_provider, Proxy::Dns::Route53::Record
5
- end