netdot-restclient 2.0.1 → 2.0.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/netdot/host.rb +22 -0
- data/lib/netdot/ipblock.rb +4 -5
- data/lib/netdot/restclient/version.rb +1 -1
- data/spec/host_spec.rb +29 -4
- data/spec/ipblock_spec.rb +3 -3
- data/spec/restclient_spec.rb +6 -6
- metadata +73 -23
data/lib/netdot/host.rb
CHANGED
@@ -51,6 +51,28 @@ module Netdot
|
|
51
51
|
@connection.post('host', 'name' => name, 'address' => ip)
|
52
52
|
end
|
53
53
|
|
54
|
+
# Creates a DNS A record for the specified name, using the next
|
55
|
+
# available IP address in the given subnet.
|
56
|
+
# Will also create PTR record if .arpa zone exists.
|
57
|
+
# @param name [String]
|
58
|
+
# @param subnet [String]
|
59
|
+
# @return [String] IP address allocated
|
60
|
+
def create_next(name, subnet)
|
61
|
+
Netdot.logger.debug("Creating new DNS records with name:#{name}" \
|
62
|
+
" and in subnet:#{subnet}")
|
63
|
+
host = @connection.post('host', 'name' => name, 'subnet' => subnet)
|
64
|
+
r = find_by_name(host['name'])
|
65
|
+
# The issue here is that the response only gives us the RR
|
66
|
+
# which can have both IPv4 and IPv6 addresses, so we need to
|
67
|
+
# try to pick the right one to return
|
68
|
+
r['Ipblock'].keys.each do |id|
|
69
|
+
if (r['Ipblock'][id]['parent'] == subnet)
|
70
|
+
return r['Ipblock'][id]['address']
|
71
|
+
end
|
72
|
+
end
|
73
|
+
fail 'Failed to find the allocated address'
|
74
|
+
end
|
75
|
+
|
54
76
|
# Updates the DNS A record for the sepcified name and IP.
|
55
77
|
# Will also create PTR record if .arpa zone exists.
|
56
78
|
# @param name [String]
|
data/lib/netdot/ipblock.rb
CHANGED
@@ -21,9 +21,8 @@ module Netdot
|
|
21
21
|
# @return [String] new Ipblock id, or nil
|
22
22
|
def allocate(container, prefix = 24, description = nil)
|
23
23
|
# Netdot currently only supports /24 prefixes
|
24
|
-
fail ArgumentError,
|
25
|
-
|
26
|
-
unless prefix == 24
|
24
|
+
fail ArgumentError, "Prefix size #{prefix} is not currently supported \
|
25
|
+
(must be 24)" unless prefix == 24
|
27
26
|
|
28
27
|
# Search for container and get its ID
|
29
28
|
cont_id = find_by_addr(container)
|
@@ -111,8 +110,8 @@ module Netdot
|
|
111
110
|
# @return [Array<Ipblock>]
|
112
111
|
def find_by_descr(descr)
|
113
112
|
@connection.get("Ipblock?description=#{descr}")['Ipblock']
|
114
|
-
|
115
|
-
|
113
|
+
rescue => e
|
114
|
+
raise unless e.message =~ /404/
|
116
115
|
end
|
117
116
|
end
|
118
117
|
end
|
data/spec/host_spec.rb
CHANGED
@@ -3,10 +3,14 @@ require 'spec_helper'
|
|
3
3
|
describe Netdot::Host do
|
4
4
|
before :all do
|
5
5
|
@netdot = connect
|
6
|
+
@ipblock = Netdot::Ipblock.new(connection: @netdot)
|
6
7
|
@host = Netdot::Host.new(connection: @netdot) if @host.nil?
|
7
|
-
|
8
|
-
|
9
|
-
@
|
8
|
+
@test_net = '198.18.254.0/24' # RFC 2544
|
9
|
+
@test_6net = '2001:db8:ffff::/64' # RFC 3839
|
10
|
+
@netdot.post('Ipblock', 'address' => @test_net, 'status' => 'Subnet')
|
11
|
+
@netdot.post('Ipblock', 'address' => @test_6net, 'status' => 'Subnet')
|
12
|
+
@cidr = NetAddr::CIDR.create(@test_net)
|
13
|
+
@cidr6 = NetAddr::CIDR.create(@test_6net)
|
10
14
|
end
|
11
15
|
|
12
16
|
context 'when creating a new Host instance' do
|
@@ -24,12 +28,24 @@ describe Netdot::Host do
|
|
24
28
|
end
|
25
29
|
|
26
30
|
context 'when creating a new host' do
|
27
|
-
it 'creates
|
31
|
+
it 'creates new records for given name and IP' do
|
28
32
|
h = @host.create('rspec-test0-01-yyy', @cidr.nth(1))
|
29
33
|
expect(h.key? 'name').to be_truthy
|
30
34
|
expect(h['name']).to match('rspec-test0-01-yyy')
|
31
35
|
end
|
32
36
|
|
37
|
+
it 'creates new records for given name in given v4 subnet' do
|
38
|
+
h = @host.create_next('rspec-test0-02-yyy', @cidr.to_s)
|
39
|
+
expect(h).to be_truthy
|
40
|
+
expect(h).to match(@cidr.nth(2))
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'creates new records for given name in given v6 subnet' do
|
44
|
+
h = @host.create_next('rspec-test0-02-yyy', @cidr6.to_s(Short: true))
|
45
|
+
expect(h).to be_truthy
|
46
|
+
expect(h).to match(@cidr6.nth(1, Short: true))
|
47
|
+
end
|
48
|
+
|
33
49
|
it 'updates an existing allocation' do
|
34
50
|
h = @host.update('rspec-test0-01-zzz', @cidr.nth(1))
|
35
51
|
expect(h.key? 'name').to be_truthy
|
@@ -56,4 +72,13 @@ describe Netdot::Host do
|
|
56
72
|
end.not_to raise_error
|
57
73
|
end
|
58
74
|
end
|
75
|
+
|
76
|
+
context 'when cleaning up' do
|
77
|
+
it 'deletes test subnet and all its children' do
|
78
|
+
expect(@ipblock.delete(@test_net, true)).to be_truthy
|
79
|
+
end
|
80
|
+
it 'deletes test v6 subnet and all its children' do
|
81
|
+
expect(@ipblock.delete(@test_6net, true)).to be_truthy
|
82
|
+
end
|
83
|
+
end
|
59
84
|
end
|
data/spec/ipblock_spec.rb
CHANGED
@@ -42,11 +42,11 @@ describe Netdot::Ipblock do
|
|
42
42
|
it 'raises an exception for an improperly formatted name' do
|
43
43
|
expect do
|
44
44
|
@ipblock.find_by_descr('rspec-Ipblock-one&Foo=bar')
|
45
|
-
end.to raise_error
|
45
|
+
end.to raise_error(RuntimeError)
|
46
46
|
end
|
47
47
|
|
48
|
-
it 'return nil for
|
49
|
-
expect(@ipblock.find_by_descr('')).to be_nil
|
48
|
+
it 'return nil for a non-existent string' do
|
49
|
+
expect(@ipblock.find_by_descr('21684dfgergscvfwr')).to be_nil
|
50
50
|
end
|
51
51
|
|
52
52
|
it 'return nil if not found' do
|
data/spec/restclient_spec.rb
CHANGED
@@ -24,7 +24,7 @@ describe Netdot::RestClient do
|
|
24
24
|
}
|
25
25
|
expect do
|
26
26
|
Netdot::RestClient.new(args)
|
27
|
-
end.to raise_error
|
27
|
+
end.to raise_error(RuntimeError)
|
28
28
|
end
|
29
29
|
|
30
30
|
# The following two assume that local server has SSL
|
@@ -38,7 +38,7 @@ describe Netdot::RestClient do
|
|
38
38
|
if ENV['SERVER'] =~ /^https:/
|
39
39
|
expect do
|
40
40
|
Netdot::RestClient.new(args)
|
41
|
-
end.to raise_error
|
41
|
+
end.to raise_error(RuntimeError)
|
42
42
|
else
|
43
43
|
STDERR.puts 'Warning: Skipping the following test' \
|
44
44
|
", as URL scheme is not 'https:'"
|
@@ -67,7 +67,7 @@ describe Netdot::RestClient do
|
|
67
67
|
it 'invalid resource raises exception' do
|
68
68
|
expect do
|
69
69
|
@netdot.get('foobar')
|
70
|
-
end.to raise_error
|
70
|
+
end.to raise_error(RuntimeError)
|
71
71
|
end
|
72
72
|
|
73
73
|
it 'valid resource as hash' do
|
@@ -90,7 +90,7 @@ describe Netdot::RestClient do
|
|
90
90
|
it 'fails to update invalid record' do
|
91
91
|
expect do
|
92
92
|
@netdot.post('Foobar/1', 'key' => 'value')
|
93
|
-
end.to raise_error
|
93
|
+
end.to raise_error(RuntimeError)
|
94
94
|
end
|
95
95
|
|
96
96
|
it 'creates new record' do
|
@@ -110,7 +110,7 @@ describe Netdot::RestClient do
|
|
110
110
|
'lastname' => 'Plumber',
|
111
111
|
'username' => 'joetubes'
|
112
112
|
)
|
113
|
-
end.to raise_error
|
113
|
+
end.to raise_error(RuntimeError)
|
114
114
|
end
|
115
115
|
end
|
116
116
|
|
@@ -118,7 +118,7 @@ describe Netdot::RestClient do
|
|
118
118
|
it 'fails to delete invalid record' do
|
119
119
|
expect do
|
120
120
|
@netdot.delete('FooBar/1234')
|
121
|
-
end.to raise_error
|
121
|
+
end.to raise_error(RuntimeError)
|
122
122
|
end
|
123
123
|
|
124
124
|
it 'deletes exiting record' do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: netdot-restclient
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-10-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: '1.9'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.9'
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: logger
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ~>
|
@@ -32,10 +37,15 @@ dependencies:
|
|
32
37
|
version: '1.2'
|
33
38
|
type: :development
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '1.2'
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: netaddr
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ~>
|
@@ -43,10 +53,15 @@ dependencies:
|
|
43
53
|
version: '1.5'
|
44
54
|
type: :development
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.5'
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: rake
|
49
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
67
|
- - ~>
|
@@ -54,10 +69,15 @@ dependencies:
|
|
54
69
|
version: '10.4'
|
55
70
|
type: :development
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '10.4'
|
58
78
|
- !ruby/object:Gem::Dependency
|
59
79
|
name: redcarpet
|
60
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
61
81
|
none: false
|
62
82
|
requirements:
|
63
83
|
- - ~>
|
@@ -65,10 +85,15 @@ dependencies:
|
|
65
85
|
version: '3.2'
|
66
86
|
type: :development
|
67
87
|
prerelease: false
|
68
|
-
version_requirements:
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '3.2'
|
69
94
|
- !ruby/object:Gem::Dependency
|
70
95
|
name: rspec
|
71
|
-
requirement:
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
72
97
|
none: false
|
73
98
|
requirements:
|
74
99
|
- - ~>
|
@@ -76,10 +101,15 @@ dependencies:
|
|
76
101
|
version: '2.99'
|
77
102
|
type: :development
|
78
103
|
prerelease: false
|
79
|
-
version_requirements:
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '2.99'
|
80
110
|
- !ruby/object:Gem::Dependency
|
81
111
|
name: rubocop
|
82
|
-
requirement:
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
83
113
|
none: false
|
84
114
|
requirements:
|
85
115
|
- - ~>
|
@@ -87,10 +117,15 @@ dependencies:
|
|
87
117
|
version: '0.31'
|
88
118
|
type: :development
|
89
119
|
prerelease: false
|
90
|
-
version_requirements:
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ~>
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0.31'
|
91
126
|
- !ruby/object:Gem::Dependency
|
92
127
|
name: yard
|
93
|
-
requirement:
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
94
129
|
none: false
|
95
130
|
requirements:
|
96
131
|
- - ~>
|
@@ -98,10 +133,15 @@ dependencies:
|
|
98
133
|
version: '0.8'
|
99
134
|
type: :development
|
100
135
|
prerelease: false
|
101
|
-
version_requirements:
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ~>
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0.8'
|
102
142
|
- !ruby/object:Gem::Dependency
|
103
143
|
name: httpclient
|
104
|
-
requirement:
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
105
145
|
none: false
|
106
146
|
requirements:
|
107
147
|
- - ~>
|
@@ -109,10 +149,15 @@ dependencies:
|
|
109
149
|
version: '2.6'
|
110
150
|
type: :runtime
|
111
151
|
prerelease: false
|
112
|
-
version_requirements:
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ~>
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '2.6'
|
113
158
|
- !ruby/object:Gem::Dependency
|
114
159
|
name: xml-simple
|
115
|
-
requirement:
|
160
|
+
requirement: !ruby/object:Gem::Requirement
|
116
161
|
none: false
|
117
162
|
requirements:
|
118
163
|
- - ~>
|
@@ -120,7 +165,12 @@ dependencies:
|
|
120
165
|
version: '1.1'
|
121
166
|
type: :runtime
|
122
167
|
prerelease: false
|
123
|
-
version_requirements:
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
170
|
+
requirements:
|
171
|
+
- - ~>
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '1.1'
|
124
174
|
description: Talk to Netdot via REST with Ruby
|
125
175
|
email:
|
126
176
|
- cvicente@gmail.com
|
@@ -170,7 +220,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
170
220
|
version: '0'
|
171
221
|
requirements: []
|
172
222
|
rubyforge_project:
|
173
|
-
rubygems_version: 1.8.
|
223
|
+
rubygems_version: 1.8.23.2
|
174
224
|
signing_key:
|
175
225
|
specification_version: 3
|
176
226
|
summary: RESTful API client for Netdot
|