seiso-import_master 0.0.3 → 0.0.4
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/.gitignore +1 -0
- data/bin/seiso-import-master +23 -7
- data/lib/seiso/import_master.rb +3 -4
- data/lib/seiso/import_master/link_factory.rb +41 -41
- data/lib/seiso/import_master/master_item_mapper.rb +270 -270
- data/lib/seiso/import_master/uri_factory.rb +40 -40
- data/refresh +2 -0
- data/seiso-import_master.gemspec +2 -2
- data/test/test_master_item_mapper.rb +2 -2
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MWFiZGMwNjdkYjNiZmEzMzk1Mzk3MDcyZTZjNTdlNmU2ZWVkN2VmYw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
OWE5YTljODk0YTk2NTNmMjJjYTY0MzU4MjhiNzk4Y2E4MTI5ZTRlZA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NDg4Mjk5YWFkZTI4MjgxMWZhODU0MTc4MTc5Y2U5NGViODg0ZmI4YjY1MDQw
|
10
|
+
Nzk2MzczMGIxOTI4ZjM1MzI4NTcwNmY5ZjdkNGYyOGUyZDJjZjdhYTY3Nzky
|
11
|
+
YzRkNTY3MTRhOWQzMGVmNzg3ZTBjMjg3ZTM4OWY2ZDVmOWE1NmQ=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NzA0ZmUyMWVkMjQzNzI1Y2FmMTk4YWU0ODUxMWI3YWIxMDYxNmFlZjhlZmY0
|
14
|
+
YjYzYzRjMjQyYzRjZTQ0NDM1ZDBjYjc0NTZlYTE2ZjVhNWI0YWQ1MDgwYWM3
|
15
|
+
ZWZmMzViZmNjNDcxYjY0MTI5ODRjODEyZjVkZWRhMGMxOWU0ZjU=
|
data/.gitignore
CHANGED
data/bin/seiso-import-master
CHANGED
@@ -8,7 +8,7 @@ require 'yaml'
|
|
8
8
|
|
9
9
|
# Imports Seiso data master files into Seiso.
|
10
10
|
#
|
11
|
-
# Author:: Willie Wheeler
|
11
|
+
# Author:: Willie Wheeler
|
12
12
|
# Copyright:: Copyright (c) 2014-2015 Expedia, Inc.
|
13
13
|
# License:: Apache 2.0
|
14
14
|
|
@@ -18,18 +18,34 @@ option_parser = OptionParser.new do |opts|
|
|
18
18
|
opts.banner = "Import one or more Seiso data master files into Seiso.
|
19
19
|
|
20
20
|
Usage: #{executable_name} [options] master_file ..."
|
21
|
+
options[:seiso_settings_path] = "#{Dir.home}/.seiso-importers/seiso.yml"
|
22
|
+
opts.on("--seiso SEISO_SETTINGS_PATH", "Path to Seiso API settings file") do |path|
|
23
|
+
options[:seiso_settings_path] = path
|
24
|
+
end
|
25
|
+
|
26
|
+
options[:format] = 'json'
|
21
27
|
opts.on("-f FORMAT", "--format FORMAT", "Document format, either 'json' (default) or 'yaml'") do |format|
|
22
28
|
options[:format] = format
|
23
29
|
end
|
30
|
+
|
31
|
+
opts.on("-h", "--help", "Display this screen") do
|
32
|
+
puts opts
|
33
|
+
exit
|
34
|
+
end
|
24
35
|
end
|
25
36
|
|
26
|
-
|
37
|
+
begin
|
38
|
+
option_parser.parse!
|
39
|
+
rescue OptionParser::InvalidOption => e
|
40
|
+
abort "Invalid option.\n\n#{option_parser.help}"
|
41
|
+
end
|
42
|
+
|
43
|
+
puts "Using: #{options[:seiso_settings_path]}"
|
44
|
+
puts "Using: format=#{options[:format]}"
|
45
|
+
|
27
46
|
files = ARGV
|
28
47
|
abort "Error: You must supply a master file.\n\n#{option_parser.help}" if files.empty?
|
29
48
|
|
30
|
-
|
31
|
-
puts "Using #{format} format"
|
32
|
-
|
33
|
-
settings = YAML.load_file "#{Dir.home}/.seiso-importers/seiso.yml"
|
49
|
+
settings = YAML.load_file(options[:seiso_settings_path])
|
34
50
|
importer = Seiso::ImportMaster.new settings
|
35
|
-
importer.import_files(files, format)
|
51
|
+
importer.import_files(files, options[:format])
|
data/lib/seiso/import_master.rb
CHANGED
@@ -13,7 +13,6 @@ module Seiso
|
|
13
13
|
# Author:: Willie Wheeler (mailto:wwheeler@expedia.com)
|
14
14
|
# Copyright:: Copyright (c) 2014-2015 Expedia, Inc.
|
15
15
|
# License:: Apache 2.0
|
16
|
-
|
17
16
|
class ImportMaster
|
18
17
|
|
19
18
|
# Initializes the importer with a Seiso connector.
|
@@ -21,9 +20,9 @@ module Seiso
|
|
21
20
|
@seiso = Seiso::Connector.new seiso_settings
|
22
21
|
|
23
22
|
# TODO Inject dependencies?
|
24
|
-
@uri_factory = Seiso::UriFactory.new @seiso.base_uri
|
25
|
-
@link_factory = Seiso::LinkFactory.new @uri_factory
|
26
|
-
@mapper = Seiso::MasterItemMapper.new @link_factory
|
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
|
27
26
|
|
28
27
|
@loaders = {
|
29
28
|
'json' => ->(file) { JSON.parse(IO.read(file)) },
|
@@ -1,48 +1,48 @@
|
|
1
|
-
# Seiso namespace module
|
2
1
|
module Seiso
|
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
|
-
|
10
|
-
class LinkFactory
|
11
|
-
|
12
|
-
# Creates a new link factory, injecting the URI factory.
|
13
|
-
# - uri_factory: URI factory
|
14
|
-
def initialize(uri_factory)
|
15
|
-
@uri_factory = uri_factory
|
16
|
-
end
|
2
|
+
class ImportMaster
|
17
3
|
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
# -
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
{
|
26
|
-
'_self' => @uri_factory.item_uri(type, key_value),
|
27
|
-
|
28
|
-
# FIXME Deprecated. To replace with _self URI above.
|
29
|
-
key_name => key_value
|
30
|
-
}
|
31
|
-
end
|
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
|
32
10
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
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?
|
39
23
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
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
46
|
end
|
47
47
|
end
|
48
48
|
end
|
@@ -1,170 +1,169 @@
|
|
1
|
-
# Seiso namespace module
|
2
1
|
module Seiso
|
2
|
+
class ImportMaster
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
class MasterItemMapper
|
4
|
+
# Maps the data master format to the Seiso API format.
|
5
|
+
#
|
6
|
+
# Author:: Willie Wheeler (mailto:wwheeler@expedia.com)
|
7
|
+
# Copyright:: Copyright (c) 2014-2015 Expedia, Inc.
|
8
|
+
# License:: Apache 2.0
|
9
|
+
class MasterItemMapper
|
11
10
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
}
|
33
|
-
end
|
34
|
-
|
35
|
-
# Maps a list of items.
|
36
|
-
# - type: Item type
|
37
|
-
# - items: Item list
|
38
|
-
def map_all(type, items)
|
39
|
-
mapper = mapper_for type
|
40
|
-
result = []
|
41
|
-
items.each { |i| result << mapper.call(i) }
|
42
|
-
result
|
43
|
-
end
|
44
|
-
|
45
|
-
# Maps a single item.
|
46
|
-
# - type: Item type
|
47
|
-
# - item: Item
|
48
|
-
def map_one(type, item)
|
49
|
-
mapper_for(type).call item
|
50
|
-
end
|
51
|
-
|
52
|
-
private
|
53
|
-
|
54
|
-
# Returns a link for the specified item, or nil if key_value is nil.
|
55
|
-
def link_for(type, key_name, key_value)
|
56
|
-
# Do nil check here (even though link factory does it too) since the unit test requires this behavior.
|
57
|
-
return key_value.nil? ? nil : @link_factory.link(type, key_name, key_value)
|
58
|
-
end
|
59
|
-
|
60
|
-
# Returns a mapper lambda for the specified type.
|
61
|
-
def mapper_for(type)
|
62
|
-
mapper = @mappers[type]
|
63
|
-
raise ArgumentError, "Unknown type: #{type}" if mapper.nil?
|
64
|
-
mapper
|
65
|
-
end
|
66
|
-
|
67
|
-
# Returns a mapper lambda.
|
68
|
-
def data_center_mapper
|
69
|
-
->(dc) {
|
70
|
-
{
|
71
|
-
'key' => dc['key'],
|
72
|
-
'name' => dc['name'],
|
73
|
-
'region' => link_for('regions', 'key', dc['region'])
|
11
|
+
def initialize(link_factory)
|
12
|
+
@link_factory = link_factory
|
13
|
+
@mappers = {
|
14
|
+
'data-centers' => data_center_mapper,
|
15
|
+
'environments' => environment_mapper,
|
16
|
+
'health-statuses' => health_status_mapper,
|
17
|
+
'infrastructure-providers' => infrastructure_provider_mapper,
|
18
|
+
'ip-address-roles' => ip_address_role_mapper,
|
19
|
+
'load-balancers' => load_balancer_mapper,
|
20
|
+
'machines' => machine_mapper,
|
21
|
+
'nodes' => node_mapper,
|
22
|
+
'node-ip-addresses' => node_ip_address_mapper,
|
23
|
+
'regions' => region_mapper,
|
24
|
+
'rotation-statuses' => rotation_status_mapper,
|
25
|
+
'services' => service_mapper,
|
26
|
+
'service-groups' => service_group_mapper,
|
27
|
+
'service-instances' => service_instance_mapper,
|
28
|
+
'service-instance-ports' => service_instance_port_mapper,
|
29
|
+
'service-types' => service_type_mapper,
|
30
|
+
'status-types' => status_type_mapper
|
74
31
|
}
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
32
|
+
end
|
33
|
+
|
34
|
+
# Maps a list of items.
|
35
|
+
# - type: Item type
|
36
|
+
# - items: Item list
|
37
|
+
def map_all(type, items)
|
38
|
+
mapper = mapper_for type
|
39
|
+
result = []
|
40
|
+
items.each { |i| result << mapper.call(i) }
|
41
|
+
result
|
42
|
+
end
|
43
|
+
|
44
|
+
# Maps a single item.
|
45
|
+
# - type: Item type
|
46
|
+
# - item: Item
|
47
|
+
def map_one(type, item)
|
48
|
+
mapper_for(type).call item
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
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
|
+
# Returns a mapper lambda for the specified type.
|
60
|
+
def mapper_for(type)
|
61
|
+
mapper = @mappers[type]
|
62
|
+
raise ArgumentError, "Unknown type: #{type}" if mapper.nil?
|
63
|
+
mapper
|
64
|
+
end
|
65
|
+
|
66
|
+
# Returns a mapper lambda.
|
67
|
+
def data_center_mapper
|
68
|
+
->(dc) {
|
69
|
+
{
|
70
|
+
'key' => dc['key'],
|
71
|
+
'name' => dc['name'],
|
72
|
+
'region' => link_for('regions', 'key', dc['region'])
|
73
|
+
}
|
89
74
|
}
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
75
|
+
end
|
76
|
+
|
77
|
+
# Returns a mapper lambda.
|
78
|
+
def environment_mapper
|
79
|
+
->(e) {
|
80
|
+
{
|
81
|
+
'key' => e['key'],
|
82
|
+
'name' => e['name'],
|
83
|
+
'aka' => e['aka'],
|
84
|
+
'description' => e['description'],
|
85
|
+
|
86
|
+
# FIXME Deprecated, don't use.
|
87
|
+
'rank' => e['rank']
|
88
|
+
}
|
100
89
|
}
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
90
|
+
end
|
91
|
+
|
92
|
+
# Returns a mapper lambda.
|
93
|
+
def health_status_mapper
|
94
|
+
->(hs) {
|
95
|
+
{
|
96
|
+
'key' => hs['key'],
|
97
|
+
'name' => hs['name'],
|
98
|
+
'statusType' => link_for('status-types', 'key', hs['statusType'])
|
99
|
+
}
|
110
100
|
}
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
'name' => r['name'],
|
121
|
-
'description' => r['description']
|
101
|
+
end
|
102
|
+
|
103
|
+
# Returns a mapper lambda.
|
104
|
+
def infrastructure_provider_mapper
|
105
|
+
->(ip) {
|
106
|
+
{
|
107
|
+
'key' => ip['key'],
|
108
|
+
'name' => ip['name']
|
109
|
+
}
|
122
110
|
}
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
'apiUrl' => lb['apiUrl']
|
111
|
+
end
|
112
|
+
|
113
|
+
# Returns a mapper lambda.
|
114
|
+
def ip_address_role_mapper
|
115
|
+
# Suppressing IP addresses since we don't import those from master files.
|
116
|
+
->(r) {
|
117
|
+
{
|
118
|
+
'serviceInstance' => link_for('service-instances', 'key', r['serviceInstance']),
|
119
|
+
'name' => r['name'],
|
120
|
+
'description' => r['description']
|
121
|
+
}
|
135
122
|
}
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
'os' => m['os'],
|
149
|
-
'platform' => m['platform'],
|
150
|
-
'platformVersion' => m['platformVersion']
|
123
|
+
end
|
124
|
+
|
125
|
+
# Returns a mapper lambda.
|
126
|
+
def load_balancer_mapper
|
127
|
+
->(lb) {
|
128
|
+
{
|
129
|
+
'name' => lb['name'],
|
130
|
+
'type' => lb['type'],
|
131
|
+
'ipAddress' => lb['ipAddress'],
|
132
|
+
'dataCenter' => link_for('data-centers', 'key', lb['dataCenter']),
|
133
|
+
'apiUrl' => lb['apiUrl']
|
134
|
+
}
|
151
135
|
}
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
136
|
+
end
|
137
|
+
|
138
|
+
# Returns a mapper lambda.
|
139
|
+
def machine_mapper
|
140
|
+
->(m) {
|
141
|
+
{
|
142
|
+
'name' => m['name'],
|
143
|
+
'ipAddress' => m['ipAddress'],
|
144
|
+
'fqdn' => m['fqdn'],
|
145
|
+
'hostname' => m['hostname'],
|
146
|
+
'domain' => m['domain'],
|
147
|
+
'os' => m['os'],
|
148
|
+
'platform' => m['platform'],
|
149
|
+
'platformVersion' => m['platformVersion']
|
150
|
+
}
|
166
151
|
}
|
167
|
-
|
152
|
+
end
|
153
|
+
|
154
|
+
# Returns a mapper lambda.
|
155
|
+
def node_mapper
|
156
|
+
->(n) {
|
157
|
+
service_instance = n['serviceInstance']
|
158
|
+
ip_addresses = n['ipAddresses']
|
159
|
+
si_ref = link_for('service-instances', 'key', service_instance)
|
160
|
+
|
161
|
+
result = {
|
162
|
+
'name' => n['name'],
|
163
|
+
'serviceInstance' => si_ref,
|
164
|
+
'machine' => link_for('machines', 'name', n['machine'])
|
165
|
+
}
|
166
|
+
|
168
167
|
=begin
|
169
168
|
if ip_addresses
|
170
169
|
result['ipAddresses'] = []
|
@@ -178,95 +177,95 @@ module Seiso
|
|
178
177
|
end
|
179
178
|
=end
|
180
179
|
|
181
|
-
|
182
|
-
}
|
183
|
-
end
|
184
|
-
|
185
|
-
# Returns a mapper lambda.
|
186
|
-
def node_ip_address_mapper
|
187
|
-
# Currently suppressing rotation status and endpoints since we don't import those from master files
|
188
|
-
->(nip) {
|
189
|
-
{
|
190
|
-
'node' => link_for('nodes', 'name', nip['node']),
|
191
|
-
'ipAddressRole' => link_for('ip-address-roles', 'name', nip['ipAddressRole']),
|
192
|
-
'ipAddress' => nip['ipAddress']
|
180
|
+
result
|
193
181
|
}
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
182
|
+
end
|
183
|
+
|
184
|
+
# Returns a mapper lambda.
|
185
|
+
def node_ip_address_mapper
|
186
|
+
# Currently suppressing rotation status and endpoints since we don't import those from master files
|
187
|
+
->(nip) {
|
188
|
+
{
|
189
|
+
'node' => link_for('nodes', 'name', nip['node']),
|
190
|
+
'ipAddressRole' => link_for('ip-address-roles', 'name', nip['ipAddressRole']),
|
191
|
+
'ipAddress' => nip['ipAddress']
|
192
|
+
}
|
205
193
|
}
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
194
|
+
end
|
195
|
+
|
196
|
+
# Returns a mapper lambda.
|
197
|
+
def region_mapper
|
198
|
+
->(r) {
|
199
|
+
{
|
200
|
+
'key' => r['key'],
|
201
|
+
'name' => r['name'],
|
202
|
+
'regionKey' => r['regionKey'],
|
203
|
+
'infrastructureProvider' => link_for('infrastructure-providers', 'key', r['infrastructureProvider'])
|
204
|
+
}
|
216
205
|
}
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
'group' => link_for('service-groups', 'key', s['group']),
|
228
|
-
'type' => link_for('service-types', 'key', s['type']),
|
229
|
-
'owner' => link_for('people', 'username', s['owner']),
|
230
|
-
'platform' => s['platform'],
|
231
|
-
'scmRepository' => s['scmRepository']
|
206
|
+
end
|
207
|
+
|
208
|
+
# Returns a mapper lambda.
|
209
|
+
def rotation_status_mapper
|
210
|
+
->(rs) {
|
211
|
+
{
|
212
|
+
'key' => rs['key'],
|
213
|
+
'name' => rs['name'],
|
214
|
+
'statusType' => link_for('status-types', 'key', rs['statusType'])
|
215
|
+
}
|
232
216
|
}
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
217
|
+
end
|
218
|
+
|
219
|
+
# Returns a mapper lambda.
|
220
|
+
def service_mapper
|
221
|
+
->(s) {
|
222
|
+
{
|
223
|
+
'key' => s['key'],
|
224
|
+
'name' => s['name'],
|
225
|
+
'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
|
+
'platform' => s['platform'],
|
230
|
+
'scmRepository' => s['scmRepository']
|
231
|
+
}
|
242
232
|
}
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
'minCapacityOps' => si['minCapacityOps'],
|
233
|
+
end
|
234
|
+
|
235
|
+
# Returns a mapper lambda.
|
236
|
+
def service_group_mapper
|
237
|
+
->(sg) {
|
238
|
+
{
|
239
|
+
'key' => sg['key'],
|
240
|
+
'name' => sg['name']
|
241
|
+
}
|
242
|
+
}
|
243
|
+
end
|
244
|
+
|
245
|
+
# Returns a mapper lambda.
|
246
|
+
def service_instance_mapper
|
247
|
+
->(si) {
|
248
|
+
key = si['key']
|
249
|
+
ip_address_roles = si['ipAddressRoles']
|
250
|
+
ports = si['ports']
|
262
251
|
|
263
|
-
|
264
|
-
|
252
|
+
result = {
|
253
|
+
'key' => key,
|
254
|
+
'service' => link_for('services', 'key', si['service']),
|
255
|
+
'environment' => link_for('environments', 'key', si['environment']),
|
256
|
+
'dataCenter' => link_for('data-centers', 'key', si['dataCenter']),
|
257
|
+
'loadBalanced' => si['loadBalanced'],
|
258
|
+
'loadBalancer' => link_for('loadBalancer', 'name', si['loadBalancer']),
|
259
|
+
'minCapacityDeploy' => si['minCapacityDeploy'],
|
260
|
+
'minCapacityOps' => si['minCapacityOps'],
|
261
|
+
|
262
|
+
# FIXME Deprecated. This is a hardcoded field for an internal Expedia app, and we will remove it.
|
263
|
+
'eosManaged' => (si['eosManaged'] || false),
|
264
|
+
|
265
|
+
# FIXME Deprecated. This is the old name for the minCapacityOps field.
|
266
|
+
'requiredCapacity' => si['minCapacityOps']
|
267
|
+
}
|
265
268
|
|
266
|
-
# FIXME Deprecated. This is the old name for the minCapacityOps field.
|
267
|
-
'requiredCapacity' => si['minCapacityOps']
|
268
|
-
}
|
269
|
-
|
270
269
|
=begin
|
271
270
|
if ip_address_roles
|
272
271
|
result['ipAddressRoles'] = []
|
@@ -292,41 +291,42 @@ module Seiso
|
|
292
291
|
end
|
293
292
|
=end
|
294
293
|
|
295
|
-
|
296
|
-
}
|
297
|
-
end
|
298
|
-
|
299
|
-
# Returns a mapper lambda.
|
300
|
-
def service_instance_port_mapper
|
301
|
-
# Suppressing endpoints since we don't import those from master files.
|
302
|
-
->(p) {
|
303
|
-
{
|
304
|
-
'serviceInstance' => link_for('service-instances', 'key', p['serviceInstance']),
|
305
|
-
'number' => p['number'],
|
306
|
-
'protocol' => p['protocol'],
|
307
|
-
'description' => p['description']
|
294
|
+
result
|
308
295
|
}
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
296
|
+
end
|
297
|
+
|
298
|
+
# Returns a mapper lambda.
|
299
|
+
def service_instance_port_mapper
|
300
|
+
# Suppressing endpoints since we don't import those from master files.
|
301
|
+
->(p) {
|
302
|
+
{
|
303
|
+
'serviceInstance' => link_for('service-instances', 'key', p['serviceInstance']),
|
304
|
+
'number' => p['number'],
|
305
|
+
'protocol' => p['protocol'],
|
306
|
+
'description' => p['description']
|
307
|
+
}
|
318
308
|
}
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
309
|
+
end
|
310
|
+
|
311
|
+
# Returns a mapper lambda.
|
312
|
+
def service_type_mapper
|
313
|
+
->(st) {
|
314
|
+
{
|
315
|
+
'key' => st['key'],
|
316
|
+
'name' => st['name']
|
317
|
+
}
|
318
|
+
}
|
319
|
+
end
|
320
|
+
|
321
|
+
# Returns a mapper lambda.
|
322
|
+
def status_type_mapper
|
323
|
+
->(st) {
|
324
|
+
{
|
325
|
+
'key' => st['key'],
|
326
|
+
'name' => st['name']
|
327
|
+
}
|
328
328
|
}
|
329
|
-
|
329
|
+
end
|
330
330
|
end
|
331
331
|
end
|
332
332
|
end
|
@@ -1,48 +1,48 @@
|
|
1
|
-
# Seiso namespace module
|
2
1
|
module Seiso
|
2
|
+
class ImportMaster
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
class UriFactory
|
11
|
-
|
12
|
-
# Creates a new URI factory for the given base URI.
|
13
|
-
# - base_uri: Base URI (e.g., http://seiso.example.com)
|
14
|
-
def initialize(base_uri)
|
15
|
-
@base_uri = base_uri
|
16
|
-
@v1_uri = "#{@base_uri}/v1"
|
17
|
-
end
|
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
|
18
10
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
else
|
25
|
-
return v1_uri type
|
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"
|
26
16
|
end
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
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}"
|
37
45
|
end
|
38
|
-
end
|
39
|
-
|
40
|
-
private
|
41
|
-
|
42
|
-
# Resolves a relative path to the full URI.
|
43
|
-
# - path: relative path
|
44
|
-
def v1_uri(path)
|
45
|
-
"#{@base_uri}/v1/#{path}"
|
46
46
|
end
|
47
47
|
end
|
48
48
|
end
|
data/refresh
ADDED
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.4"
|
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.0.1"
|
24
24
|
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require 'seiso/import_master/master_item_mapper'
|
2
1
|
require 'minitest/autorun'
|
2
|
+
require 'seiso/import_master/master_item_mapper'
|
3
3
|
|
4
4
|
# Author:: Willie Wheeler (mailto:wwheeler@expedia.com)
|
5
5
|
# Copyright:: Copyright (c) 2014-2015 Expedia, Inc.
|
@@ -13,7 +13,7 @@ class TestMasterItemMapper < MiniTest::Unit::TestCase
|
|
13
13
|
{ "foo" => "bar" }
|
14
14
|
end
|
15
15
|
end
|
16
|
-
@mapper = Seiso::MasterItemMapper.new link_factory
|
16
|
+
@mapper = Seiso::ImportMaster::MasterItemMapper.new link_factory
|
17
17
|
end
|
18
18
|
|
19
19
|
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.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Willie Wheeler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-24 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:
|
47
|
+
version: 0.0.1
|
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:
|
54
|
+
version: 0.0.1
|
55
55
|
description: Supports self-service data management via version control, e.g. by using
|
56
56
|
GitHub.
|
57
57
|
email:
|
@@ -72,6 +72,7 @@ files:
|
|
72
72
|
- lib/seiso/import_master/link_factory.rb
|
73
73
|
- lib/seiso/import_master/master_item_mapper.rb
|
74
74
|
- lib/seiso/import_master/uri_factory.rb
|
75
|
+
- refresh
|
75
76
|
- sample_conf/seiso.yml.sample
|
76
77
|
- seiso-import_master.gemspec
|
77
78
|
- test/test_master_item_mapper.rb
|