seiso-import_master 0.0.4 → 0.0.5
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.
- checksums.yaml +8 -8
- data/lib/seiso/import_master/master_item_mapper.rb +44 -92
- data/lib/seiso/import_master.rb +17 -12
- data/seiso-import_master.gemspec +2 -2
- data/test/test_master_item_mapper.rb +1 -6
- metadata +4 -6
- data/lib/seiso/import_master/link_factory.rb +0 -48
- data/lib/seiso/import_master/uri_factory.rb +0 -48
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
OTcxYjBhNzczYjI0YmEyMGRjYjQ5NjVmYWE5NzIzYWQyODhhOTc1Zg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZTgwZTZlY2Y4ZTFiNGZhOGFkMDEzYzRmNjYyOWZhMDE4YWI3OTUwMw==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
M2MwZTkxNzhiYTY0ZWIwOWI4OGJhYTFmODU4MmQ5YjU3ZGFkY2I3Y2NmMWUw
|
10
|
+
MmM5OThmY2M1OGY1Yzg1M2U4NTU4ZjcwOGVkYjBmNmNmNGZiNzZlMGQxMDBi
|
11
|
+
ZjNiNGNjZTg0OGQzOGU1MTJhY2MyODFlODQ0MmYwMGE5ODJlZTM=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZGJkOWQyZGNlNmUwNTIxNGE2NDYwYTFmYjFhMDEwNGM4OTBhMGJkM2JjYWY5
|
14
|
+
MTczZDA2YTFjY2VhNjIzZTkwMjNiYjIyMjZjZmQzOTZjYjFhNTllOWRmMjM3
|
15
|
+
NWJjNmJkMGJmZTA4ODIwYjZkNDAyMGRjM2UzYzYxNzFiNWYzMjc=
|
@@ -3,13 +3,12 @@ module Seiso
|
|
3
3
|
|
4
4
|
# Maps the data master format to the Seiso API format.
|
5
5
|
#
|
6
|
-
# Author:: Willie Wheeler
|
6
|
+
# Author:: Willie Wheeler
|
7
7
|
# Copyright:: Copyright (c) 2014-2015 Expedia, Inc.
|
8
8
|
# License:: Apache 2.0
|
9
9
|
class MasterItemMapper
|
10
10
|
|
11
|
-
def initialize
|
12
|
-
@link_factory = link_factory
|
11
|
+
def initialize
|
13
12
|
@mappers = {
|
14
13
|
'data-centers' => data_center_mapper,
|
15
14
|
'environments' => environment_mapper,
|
@@ -50,12 +49,6 @@ module Seiso
|
|
50
49
|
|
51
50
|
private
|
52
51
|
|
53
|
-
# Returns a link for the specified item, or nil if key_value is nil.
|
54
|
-
def link_for(type, key_name, key_value)
|
55
|
-
# Do nil check here (even though link factory does it too) since the unit test requires this behavior.
|
56
|
-
return key_value.nil? ? nil : @link_factory.link(type, key_name, key_value)
|
57
|
-
end
|
58
|
-
|
59
52
|
# Returns a mapper lambda for the specified type.
|
60
53
|
def mapper_for(type)
|
61
54
|
mapper = @mappers[type]
|
@@ -63,18 +56,16 @@ module Seiso
|
|
63
56
|
mapper
|
64
57
|
end
|
65
58
|
|
66
|
-
# Returns a mapper lambda.
|
67
59
|
def data_center_mapper
|
68
60
|
->(dc) {
|
69
61
|
{
|
70
62
|
'key' => dc['key'],
|
71
63
|
'name' => dc['name'],
|
72
|
-
'region' =>
|
64
|
+
'region' => { 'key' => dc['region'] }
|
73
65
|
}
|
74
66
|
}
|
75
67
|
end
|
76
68
|
|
77
|
-
# Returns a mapper lambda.
|
78
69
|
def environment_mapper
|
79
70
|
->(e) {
|
80
71
|
{
|
@@ -89,18 +80,16 @@ module Seiso
|
|
89
80
|
}
|
90
81
|
end
|
91
82
|
|
92
|
-
# Returns a mapper lambda.
|
93
83
|
def health_status_mapper
|
94
84
|
->(hs) {
|
95
85
|
{
|
96
86
|
'key' => hs['key'],
|
97
87
|
'name' => hs['name'],
|
98
|
-
'statusType' =>
|
88
|
+
'statusType' => { 'key' => hs['statusType'] }
|
99
89
|
}
|
100
90
|
}
|
101
91
|
end
|
102
92
|
|
103
|
-
# Returns a mapper lambda.
|
104
93
|
def infrastructure_provider_mapper
|
105
94
|
->(ip) {
|
106
95
|
{
|
@@ -110,32 +99,33 @@ module Seiso
|
|
110
99
|
}
|
111
100
|
end
|
112
101
|
|
113
|
-
# Returns a mapper lambda.
|
114
102
|
def ip_address_role_mapper
|
115
103
|
# Suppressing IP addresses since we don't import those from master files.
|
116
104
|
->(r) {
|
117
105
|
{
|
118
|
-
'serviceInstance' =>
|
106
|
+
'serviceInstance' => { 'key' => r['serviceInstance'] },
|
119
107
|
'name' => r['name'],
|
120
108
|
'description' => r['description']
|
121
109
|
}
|
122
110
|
}
|
123
111
|
end
|
124
112
|
|
125
|
-
# Returns a mapper lambda.
|
126
113
|
def load_balancer_mapper
|
127
114
|
->(lb) {
|
128
|
-
{
|
115
|
+
seiso_lb = {
|
129
116
|
'name' => lb['name'],
|
130
117
|
'type' => lb['type'],
|
131
118
|
'ipAddress' => lb['ipAddress'],
|
132
|
-
'dataCenter' => link_for('data-centers', 'key', lb['dataCenter']),
|
133
119
|
'apiUrl' => lb['apiUrl']
|
134
120
|
}
|
121
|
+
|
122
|
+
dc = lb['dataCenter']
|
123
|
+
seiso_lb['dataCenter'] = { 'key' => dc } unless dc.nil?
|
124
|
+
|
125
|
+
seiso_lb
|
135
126
|
}
|
136
127
|
end
|
137
128
|
|
138
|
-
# Returns a mapper lambda.
|
139
129
|
def machine_mapper
|
140
130
|
->(m) {
|
141
131
|
{
|
@@ -151,88 +141,75 @@ module Seiso
|
|
151
141
|
}
|
152
142
|
end
|
153
143
|
|
154
|
-
# Returns a mapper lambda.
|
155
144
|
def node_mapper
|
156
145
|
->(n) {
|
157
|
-
|
158
|
-
ip_addresses = n['ipAddresses']
|
159
|
-
si_ref = link_for('service-instances', 'key', service_instance)
|
160
|
-
|
161
|
-
result = {
|
146
|
+
seiso_node = {
|
162
147
|
'name' => n['name'],
|
163
|
-
'serviceInstance' =>
|
164
|
-
'machine' => link_for('machines', 'name', n['machine'])
|
148
|
+
'serviceInstance' => { 'key' => n['serviceInstance'] }
|
165
149
|
}
|
166
|
-
|
167
|
-
=
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
role_name = ip['ipAddressRole']
|
172
|
-
result['ipAddresses'] << {
|
173
|
-
'ipAddressRole' => @link_factory.ip_address_role_link(service_instance, role_name),
|
174
|
-
'ipAddress' => ip['ipAddress']
|
175
|
-
}
|
176
|
-
end
|
177
|
-
end
|
178
|
-
=end
|
179
|
-
|
180
|
-
result
|
150
|
+
|
151
|
+
machine = n['machine']
|
152
|
+
seiso_node['machine'] = { 'name' => machine } unless machine.nil?
|
153
|
+
|
154
|
+
seiso_node
|
181
155
|
}
|
182
156
|
end
|
183
157
|
|
184
|
-
# Returns a mapper lambda.
|
185
158
|
def node_ip_address_mapper
|
186
159
|
# Currently suppressing rotation status and endpoints since we don't import those from master files
|
187
160
|
->(nip) {
|
188
161
|
{
|
189
|
-
'node' =>
|
190
|
-
'ipAddressRole' =>
|
162
|
+
'node' => { 'name' => nip['node'] },
|
163
|
+
'ipAddressRole' => { 'name' => nip['ipAddressRole'] },
|
191
164
|
'ipAddress' => nip['ipAddress']
|
192
165
|
}
|
193
166
|
}
|
194
167
|
end
|
195
168
|
|
196
|
-
# Returns a mapper lambda.
|
197
169
|
def region_mapper
|
198
170
|
->(r) {
|
199
171
|
{
|
200
172
|
'key' => r['key'],
|
201
173
|
'name' => r['name'],
|
202
174
|
'regionKey' => r['regionKey'],
|
203
|
-
'infrastructureProvider' =>
|
175
|
+
'infrastructureProvider' => { 'key' => r['infrastructureProvider'] }
|
204
176
|
}
|
205
177
|
}
|
206
178
|
end
|
207
179
|
|
208
|
-
# Returns a mapper lambda.
|
209
180
|
def rotation_status_mapper
|
210
181
|
->(rs) {
|
211
182
|
{
|
212
183
|
'key' => rs['key'],
|
213
184
|
'name' => rs['name'],
|
214
|
-
'statusType' =>
|
185
|
+
'statusType' => { 'key' => rs['statusType'] }
|
215
186
|
}
|
216
187
|
}
|
217
188
|
end
|
218
189
|
|
219
|
-
# Returns a mapper lambda.
|
220
190
|
def service_mapper
|
221
191
|
->(s) {
|
222
|
-
{
|
192
|
+
seiso_service = {
|
223
193
|
'key' => s['key'],
|
224
194
|
'name' => s['name'],
|
225
195
|
'description' => s['description'],
|
226
|
-
'group' => link_for('service-groups', 'key', s['group']),
|
227
|
-
'type' => link_for('service-types', 'key', s['type']),
|
228
|
-
'owner' => link_for('people', 'username', s['owner']),
|
229
196
|
'platform' => s['platform'],
|
230
197
|
'scmRepository' => s['scmRepository']
|
231
198
|
}
|
199
|
+
|
200
|
+
group = s['group']
|
201
|
+
seiso_service['group'] = { 'key' => group } unless group.nil?
|
202
|
+
|
203
|
+
type = s['type']
|
204
|
+
seiso_service['type'] = { 'key' => type } unless type.nil?
|
205
|
+
|
206
|
+
owner = s['owner']
|
207
|
+
seiso_service['owner'] = { 'username' => owner } unless owner.nil?
|
208
|
+
|
209
|
+
seiso_service
|
232
210
|
}
|
233
211
|
end
|
234
212
|
|
235
|
-
# Returns a mapper lambda.
|
236
213
|
def service_group_mapper
|
237
214
|
->(sg) {
|
238
215
|
{
|
@@ -242,20 +219,17 @@ module Seiso
|
|
242
219
|
}
|
243
220
|
end
|
244
221
|
|
245
|
-
# Returns a mapper lambda.
|
246
222
|
def service_instance_mapper
|
247
223
|
->(si) {
|
248
224
|
key = si['key']
|
249
225
|
ip_address_roles = si['ipAddressRoles']
|
250
226
|
ports = si['ports']
|
251
227
|
|
252
|
-
|
228
|
+
seiso_si = {
|
253
229
|
'key' => key,
|
254
|
-
'service' =>
|
255
|
-
'environment' =>
|
256
|
-
'dataCenter' => link_for('data-centers', 'key', si['dataCenter']),
|
230
|
+
'service' => { 'key' => si['service'] },
|
231
|
+
'environment' => { 'key' => si['environment'] },
|
257
232
|
'loadBalanced' => si['loadBalanced'],
|
258
|
-
'loadBalancer' => link_for('loadBalancer', 'name', si['loadBalancer']),
|
259
233
|
'minCapacityDeploy' => si['minCapacityDeploy'],
|
260
234
|
'minCapacityOps' => si['minCapacityOps'],
|
261
235
|
|
@@ -265,42 +239,22 @@ module Seiso
|
|
265
239
|
# FIXME Deprecated. This is the old name for the minCapacityOps field.
|
266
240
|
'requiredCapacity' => si['minCapacityOps']
|
267
241
|
}
|
242
|
+
|
243
|
+
data_center = si['dataCenter']
|
244
|
+
seiso_si['dataCenter'] = { 'key' => data_center } unless data_center.nil?
|
268
245
|
|
269
|
-
=
|
270
|
-
|
271
|
-
result['ipAddressRoles'] = []
|
272
|
-
ip_address_roles.each do |role|
|
273
|
-
result['ipAddressRoles'] << {
|
274
|
-
'serviceInstance' => link_for('service-instances', 'key', key),
|
275
|
-
'name' => role['name'],
|
276
|
-
'description' => role['description']
|
277
|
-
}
|
278
|
-
end
|
279
|
-
end
|
246
|
+
load_balancer = si['loadBalancer']
|
247
|
+
seiso_si['loadBalancer'] = { 'name' => load_balancer } unless load_balancer.nil?
|
280
248
|
|
281
|
-
|
282
|
-
result['ports'] = []
|
283
|
-
ports.each do |port|
|
284
|
-
result['ports'] << {
|
285
|
-
'serviceInstance' => link_for('service-instances', 'key', key),
|
286
|
-
'number' => port['number'],
|
287
|
-
'protocol' => port['protocol'],
|
288
|
-
'description' => port['description']
|
289
|
-
}
|
290
|
-
end
|
291
|
-
end
|
292
|
-
=end
|
293
|
-
|
294
|
-
result
|
249
|
+
seiso_si
|
295
250
|
}
|
296
251
|
end
|
297
252
|
|
298
|
-
# Returns a mapper lambda.
|
299
253
|
def service_instance_port_mapper
|
300
254
|
# Suppressing endpoints since we don't import those from master files.
|
301
255
|
->(p) {
|
302
256
|
{
|
303
|
-
'serviceInstance' =>
|
257
|
+
'serviceInstance' => { 'key' => p['serviceInstance'] },
|
304
258
|
'number' => p['number'],
|
305
259
|
'protocol' => p['protocol'],
|
306
260
|
'description' => p['description']
|
@@ -308,7 +262,6 @@ module Seiso
|
|
308
262
|
}
|
309
263
|
end
|
310
264
|
|
311
|
-
# Returns a mapper lambda.
|
312
265
|
def service_type_mapper
|
313
266
|
->(st) {
|
314
267
|
{
|
@@ -318,7 +271,6 @@ module Seiso
|
|
318
271
|
}
|
319
272
|
end
|
320
273
|
|
321
|
-
# Returns a mapper lambda.
|
322
274
|
def status_type_mapper
|
323
275
|
->(st) {
|
324
276
|
{
|
data/lib/seiso/import_master.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
1
|
require "json"
|
2
2
|
require "seiso/connector"
|
3
3
|
require "yaml"
|
4
|
-
require_relative "import_master/link_factory"
|
5
4
|
require_relative "import_master/master_item_mapper"
|
6
|
-
require_relative "import_master/uri_factory"
|
7
5
|
|
8
6
|
# Seiso namespace module
|
9
7
|
module Seiso
|
@@ -17,19 +15,26 @@ module Seiso
|
|
17
15
|
|
18
16
|
# Initializes the importer with a Seiso connector.
|
19
17
|
def initialize(seiso_settings)
|
20
|
-
@seiso = Seiso::Connector.new
|
21
|
-
|
22
|
-
# TODO Inject dependencies?
|
23
|
-
@uri_factory = Seiso::ImportMaster::UriFactory.new @seiso.base_uri
|
24
|
-
@link_factory = Seiso::ImportMaster::LinkFactory.new @uri_factory
|
25
|
-
@mapper = Seiso::ImportMaster::MasterItemMapper.new @link_factory
|
26
|
-
|
18
|
+
@seiso = Seiso::Connector.new(seiso_settings)
|
19
|
+
@mapper = Seiso::ImportMaster::MasterItemMapper.new
|
27
20
|
@loaders = {
|
28
21
|
'json' => ->(file) { JSON.parse(IO.read(file)) },
|
29
22
|
'yaml' => ->(file) { YAML.load_file file }
|
30
23
|
}
|
31
24
|
end
|
32
25
|
|
26
|
+
def seiso
|
27
|
+
@seiso
|
28
|
+
end
|
29
|
+
|
30
|
+
def mapper
|
31
|
+
@mapper
|
32
|
+
end
|
33
|
+
|
34
|
+
def loaders
|
35
|
+
@loaders
|
36
|
+
end
|
37
|
+
|
33
38
|
# Imports a list of master files in order. Legal formats are 'json' (default) and 'yaml'.
|
34
39
|
def import_files(files, format = 'json')
|
35
40
|
loop do
|
@@ -42,7 +47,7 @@ module Seiso
|
|
42
47
|
|
43
48
|
# Imports a data master file. Legal formats are 'json' (default) and 'yaml'.
|
44
49
|
def import_file(file, format = 'json')
|
45
|
-
loader =
|
50
|
+
loader = loaders[format]
|
46
51
|
raise ArgumentError, "Illegal format: #{format}" if loader.nil?
|
47
52
|
doc = loader.call(file)
|
48
53
|
import_doc doc
|
@@ -66,8 +71,8 @@ module Seiso
|
|
66
71
|
private
|
67
72
|
|
68
73
|
def do_import_items(type, items)
|
69
|
-
seiso_items =
|
70
|
-
|
74
|
+
seiso_items = mapper.map_all(type, items)
|
75
|
+
seiso.post_items(type, seiso_items)
|
71
76
|
end
|
72
77
|
|
73
78
|
# Imports the nodes, along with their associated IP addresses.
|
data/seiso-import_master.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = "seiso-import_master"
|
7
|
-
spec.version = "0.0.
|
7
|
+
spec.version = "0.0.5"
|
8
8
|
spec.authors = ["Willie Wheeler"]
|
9
9
|
spec.email = ["wwheeler@expedia.com"]
|
10
10
|
spec.summary = "Imports Seiso data master files into Seiso."
|
@@ -20,5 +20,5 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.add_development_dependency "bundler", "~> 1.7"
|
21
21
|
spec.add_development_dependency "rake", "~> 10.0"
|
22
22
|
|
23
|
-
spec.add_runtime_dependency "seiso-connector", "~> 0.0
|
23
|
+
spec.add_runtime_dependency "seiso-connector", "~> 0.1.0"
|
24
24
|
end
|
@@ -8,12 +8,7 @@ require 'seiso/import_master/master_item_mapper'
|
|
8
8
|
class TestMasterItemMapper < MiniTest::Unit::TestCase
|
9
9
|
|
10
10
|
def setup
|
11
|
-
|
12
|
-
def self.link(type, key_name, key_value)
|
13
|
-
{ "foo" => "bar" }
|
14
|
-
end
|
15
|
-
end
|
16
|
-
@mapper = Seiso::ImportMaster::MasterItemMapper.new link_factory
|
11
|
+
@mapper = Seiso::ImportMaster::MasterItemMapper.new
|
17
12
|
end
|
18
13
|
|
19
14
|
def test_map_all_illegal_type
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: seiso-import_master
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Willie Wheeler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-01-
|
11
|
+
date: 2015-01-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - ~>
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.0
|
47
|
+
version: 0.1.0
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.0
|
54
|
+
version: 0.1.0
|
55
55
|
description: Supports self-service data management via version control, e.g. by using
|
56
56
|
GitHub.
|
57
57
|
email:
|
@@ -69,9 +69,7 @@ files:
|
|
69
69
|
- Rakefile
|
70
70
|
- bin/seiso-import-master
|
71
71
|
- lib/seiso/import_master.rb
|
72
|
-
- lib/seiso/import_master/link_factory.rb
|
73
72
|
- lib/seiso/import_master/master_item_mapper.rb
|
74
|
-
- lib/seiso/import_master/uri_factory.rb
|
75
73
|
- refresh
|
76
74
|
- sample_conf/seiso.yml.sample
|
77
75
|
- seiso-import_master.gemspec
|
@@ -1,48 +0,0 @@
|
|
1
|
-
module Seiso
|
2
|
-
class ImportMaster
|
3
|
-
|
4
|
-
# Link factory, supporting HATEOAS principle.
|
5
|
-
#
|
6
|
-
# Author:: Willie Wheeler (mailto:wwheeler@expedia.com)
|
7
|
-
# Copyright:: Copyright (c) 2014-2015 Expedia, Inc.
|
8
|
-
# License:: Apache 2.0
|
9
|
-
class LinkFactory
|
10
|
-
|
11
|
-
# Creates a new link factory, injecting the URI factory.
|
12
|
-
# - uri_factory: URI factory
|
13
|
-
def initialize(uri_factory)
|
14
|
-
@uri_factory = uri_factory
|
15
|
-
end
|
16
|
-
|
17
|
-
# Creates a new link. Only for link involving a single key, at least for now.
|
18
|
-
# - type: Item type (e.g., services, service-instances, data-centers, etc.)
|
19
|
-
# - key_name: name of the property the item type uses as a unique key
|
20
|
-
# - key_value: key value
|
21
|
-
def link(type, key_name, key_value)
|
22
|
-
return nil if key_value.nil?
|
23
|
-
|
24
|
-
{
|
25
|
-
'_self' => @uri_factory.item_uri(type, key_value),
|
26
|
-
|
27
|
-
# FIXME Deprecated. To replace with _self URI above.
|
28
|
-
key_name => key_value
|
29
|
-
}
|
30
|
-
end
|
31
|
-
|
32
|
-
# Creates a new IP address role link.
|
33
|
-
# - service_instance_key: Service instance key
|
34
|
-
# - role_name: IP address role name
|
35
|
-
def ip_address_role_link(service_instance_key, role_name)
|
36
|
-
{
|
37
|
-
'_self' => @uri_factory.item_uri('ip-address-roles', service_instance_key, role_name),
|
38
|
-
|
39
|
-
# FIXME These are deprecated. To replace with _self URI above.
|
40
|
-
'serviceInstance' => {
|
41
|
-
'key' => service_instance_key
|
42
|
-
},
|
43
|
-
'name' => role_name
|
44
|
-
}
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
@@ -1,48 +0,0 @@
|
|
1
|
-
module Seiso
|
2
|
-
class ImportMaster
|
3
|
-
|
4
|
-
# URI factory.
|
5
|
-
#
|
6
|
-
# Author:: Willie Wheeler (mailto:wwheeler@expedia.com)
|
7
|
-
# Copyright:: Copyright (c) 2014-2015 Expedia, Inc.
|
8
|
-
# License:: Apache 2.0
|
9
|
-
class UriFactory
|
10
|
-
|
11
|
-
# Creates a new URI factory for the given base URI.
|
12
|
-
# - base_uri: Base URI (e.g., http://seiso.example.com)
|
13
|
-
def initialize(base_uri)
|
14
|
-
@base_uri = base_uri
|
15
|
-
@v1_uri = "#{@base_uri}/v1"
|
16
|
-
end
|
17
|
-
|
18
|
-
# Returns the URI for the given item type.
|
19
|
-
# - type: Item type (e.g., services, service-instances, ip-address-roles, etc.)
|
20
|
-
def type_uri(type)
|
21
|
-
if type == 'ip-address-roles'
|
22
|
-
raise ArgumentError, "ip-address-roles is not a top-level type"
|
23
|
-
else
|
24
|
-
return v1_uri type
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
# Returns the URI for the given item.
|
29
|
-
# - type: Item type
|
30
|
-
# - keys: One or more item keys, which collectively uniquely identify the item within the type
|
31
|
-
def item_uri(type, *keys)
|
32
|
-
if type == 'ip-address-roles'
|
33
|
-
return v1_uri "service-instances/#{keys[0]}/ip-address-roles/#{keys[1]}"
|
34
|
-
else
|
35
|
-
return v1_uri "#{type}/#{keys[0]}"
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
private
|
40
|
-
|
41
|
-
# Resolves a relative path to the full URI.
|
42
|
-
# - path: relative path
|
43
|
-
def v1_uri(path)
|
44
|
-
"#{@base_uri}/v1/#{path}"
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|