seiso-import_master 0.0.12 → 3.0.0.M1
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/.travis.yml +3 -0
- data/README.md +12 -11
- data/Rakefile +3 -3
- data/bin/seiso-import-master +30 -13
- data/lib/seiso/import_master.rb +114 -90
- data/lib/seiso/import_master/importers.rb +5 -0
- data/lib/seiso/import_master/importers/base_importer.rb +91 -30
- data/lib/seiso/import_master/importers/data_center_importer.rb +31 -0
- data/lib/seiso/import_master/importers/environment_importer.rb +25 -0
- data/lib/seiso/import_master/importers/health_status_importer.rb +25 -0
- data/lib/seiso/import_master/importers/infrastructure_provider_importer.rb +25 -0
- data/lib/seiso/import_master/importers/ip_address_role_importer.rb +41 -0
- data/lib/seiso/import_master/importers/load_balancer_importer.rb +25 -0
- data/lib/seiso/import_master/importers/machine_importer.rb +25 -0
- data/lib/seiso/import_master/importers/node_importer.rb +94 -56
- data/lib/seiso/import_master/importers/node_ip_address_importer.rb +46 -0
- data/lib/seiso/import_master/importers/region_importer.rb +31 -0
- data/lib/seiso/import_master/importers/rotation_status_importer.rb +25 -0
- data/lib/seiso/import_master/importers/service_group_importer.rb +25 -0
- data/lib/seiso/import_master/importers/service_importer.rb +38 -143
- data/lib/seiso/import_master/importers/service_instance_importer.rb +60 -213
- data/lib/seiso/import_master/importers/service_instance_port_importer.rb +41 -0
- data/lib/seiso/import_master/importers/service_type_importer.rb +25 -0
- data/lib/seiso/import_master/importers/status_type_importer.rb +25 -0
- data/lib/seiso/import_master/mappers.rb +1 -0
- data/lib/seiso/import_master/mappers/data_center_mapper.rb +19 -0
- data/lib/seiso/import_master/mappers/environment_mapper.rb +20 -0
- data/lib/seiso/import_master/mappers/health_status_mapper.rb +20 -0
- data/lib/seiso/import_master/mappers/infrastructure_provider_mapper.rb +18 -0
- data/lib/seiso/import_master/mappers/ip_address_role_mapper.rb +18 -0
- data/lib/seiso/import_master/mappers/load_balancer_mapper.rb +21 -0
- data/lib/seiso/import_master/mappers/machine_mapper.rb +27 -0
- data/lib/seiso/import_master/mappers/node_ip_address_mapper.rb +38 -0
- data/lib/seiso/import_master/mappers/node_mapper.rb +31 -31
- data/lib/seiso/import_master/mappers/region_mapper.rb +20 -0
- data/lib/seiso/import_master/mappers/rotation_status_mapper.rb +20 -0
- data/lib/seiso/import_master/mappers/service_group_mapper.rb +18 -0
- data/lib/seiso/import_master/mappers/service_instance_mapper.rb +26 -73
- data/lib/seiso/import_master/mappers/service_instance_port_mapper.rb +19 -0
- data/lib/seiso/import_master/mappers/service_mapper.rb +23 -32
- data/lib/seiso/import_master/mappers/service_type_mapper.rb +19 -0
- data/lib/seiso/import_master/mappers/status_type_mapper.rb +18 -0
- data/lib/seiso/import_master/util.rb +1 -0
- data/lib/seiso/import_master/util/invalid_document_error.rb +9 -0
- data/lib/seiso/import_master/util/item_resolver.rb +54 -0
- data/lib/seiso/import_master/util/logger.rb +59 -0
- data/lib/seiso/import_master/util/rest_util.rb +49 -0
- data/lib/seiso/import_master/validators.rb +1 -0
- data/lib/seiso/import_master/validators/base_validator.rb +11 -18
- data/lib/seiso/import_master/validators/node_validator.rb +54 -45
- data/lib/seiso/import_master/validators/service_validator.rb +38 -44
- data/sample_conf/seiso3.yml.sample +6 -0
- data/seiso-import_master.gemspec +16 -13
- data/test/seiso/import_master/importers/test_node_importer.rb +21 -0
- metadata +66 -21
- data/lib/seiso/import_master/errors/invalid_document_error.rb +0 -11
- data/lib/seiso/import_master/importers/simple_importer.rb +0 -28
- data/lib/seiso/import_master/mappers/master_item_mapper.rb +0 -194
- data/sample_conf/seiso.yml.sample +0 -9
- data/test/test_master_item_mapper.rb +0 -257
- data/test/test_node_mapper.rb +0 -40
@@ -0,0 +1,31 @@
|
|
1
|
+
class Seiso::ImportMaster
|
2
|
+
class Importers::DataCenterImporter < Importers::BaseImporter
|
3
|
+
|
4
|
+
def initialize(api, rest_util, resolver)
|
5
|
+
@log = Util::Logger.new "DataCenterImporter"
|
6
|
+
|
7
|
+
self.api = api
|
8
|
+
self.rest_util = rest_util
|
9
|
+
self.mapper = Mappers::DataCenterMapper.new resolver
|
10
|
+
self.repo_resource = api.dataCenters.get
|
11
|
+
|
12
|
+
@log.info "Getting /dataCenters/search"
|
13
|
+
@search_resource = repo_resource.search.get
|
14
|
+
end
|
15
|
+
|
16
|
+
def import(doc)
|
17
|
+
@log.info "Importing data centers"
|
18
|
+
import_items(doc['items'], {})
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_search_params(doc_dc, context)
|
22
|
+
{ 'key' => doc_dc['key'] }
|
23
|
+
end
|
24
|
+
|
25
|
+
def find_resource(search_params)
|
26
|
+
key = search_params['key']
|
27
|
+
@log.info "Getting /dataCenters/search/findByKey?key=#{key}"
|
28
|
+
@search_resource.findByKey(key: key).get
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class Seiso::ImportMaster
|
2
|
+
class Importers::EnvironmentImporter < Importers::BaseImporter
|
3
|
+
|
4
|
+
def initialize(api, rest_util, resolver)
|
5
|
+
self.api = api
|
6
|
+
self.rest_util = rest_util
|
7
|
+
self.mapper = Mappers::EnvironmentMapper.new resolver
|
8
|
+
self.repo_resource = api.environments.get
|
9
|
+
|
10
|
+
@search_resource = repo_resource.search.get
|
11
|
+
end
|
12
|
+
|
13
|
+
def import(doc)
|
14
|
+
import_items(doc['items'], {})
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_search_params(doc_env, context)
|
18
|
+
{ 'key' => doc_env['key'] }
|
19
|
+
end
|
20
|
+
|
21
|
+
def find_resource(search_params)
|
22
|
+
@search_resource.findByKey(key: search_params['key']).get
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class Seiso::ImportMaster
|
2
|
+
class Importers::HealthStatusImporter < Importers::BaseImporter
|
3
|
+
|
4
|
+
def initialize(api, rest_util, resolver)
|
5
|
+
self.api = api
|
6
|
+
self.rest_util = rest_util
|
7
|
+
self.mapper = Mappers::HealthStatusMapper.new resolver
|
8
|
+
self.repo_resource = api.healthStatuses.get
|
9
|
+
|
10
|
+
@search_resource = repo_resource.search.get
|
11
|
+
end
|
12
|
+
|
13
|
+
def import(doc)
|
14
|
+
import_items(doc['items'], {})
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_search_params(doc_hs, context)
|
18
|
+
{ 'key' => doc_hs['key'] }
|
19
|
+
end
|
20
|
+
|
21
|
+
def find_resource(search_params)
|
22
|
+
@search_resource.findByKey(key: search_params['key']).get
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class Seiso::ImportMaster
|
2
|
+
class Importers::InfrastructureProviderImporter < Importers::BaseImporter
|
3
|
+
|
4
|
+
def initialize(api, rest_util, resolver)
|
5
|
+
self.api = api
|
6
|
+
self.rest_util = rest_util
|
7
|
+
self.mapper = Mappers::InfrastructureProviderMapper.new resolver
|
8
|
+
self.repo_resource = api.infrastructureProviders.get
|
9
|
+
|
10
|
+
@search_resource = repo_resource.search.get
|
11
|
+
end
|
12
|
+
|
13
|
+
def import(doc)
|
14
|
+
import_items(doc['items'], {})
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_search_params(doc_ip, context)
|
18
|
+
{ 'key' => doc_ip['key'] }
|
19
|
+
end
|
20
|
+
|
21
|
+
def find_resource(search_params)
|
22
|
+
@search_resource.findByKey(key: search_params['key']).get
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# TODO Reinstate the autocreation that Chris Brown wrote
|
2
|
+
|
3
|
+
class Seiso::ImportMaster
|
4
|
+
# Imports IP address roles into Seiso. This importer handles:
|
5
|
+
# - orphan removal
|
6
|
+
# - POSTing new IP address roles
|
7
|
+
# - PUTting existing IP address roles
|
8
|
+
#
|
9
|
+
# Author:: Willie Wheeler
|
10
|
+
# Copyright:: Copyright (c) 2014-2016 Expedia, Inc.
|
11
|
+
# License:: Apache 2.0
|
12
|
+
class Importers::IpAddressRoleImporter < Importers::BaseImporter
|
13
|
+
|
14
|
+
def initialize(api, rest_util)
|
15
|
+
self.api = api
|
16
|
+
self.rest_util = rest_util
|
17
|
+
self.mapper = Mappers::IpAddressRoleMapper.new
|
18
|
+
self.repo_resource = api.ipAddressRoles.get
|
19
|
+
|
20
|
+
@search_resource = repo_resource.search.get
|
21
|
+
end
|
22
|
+
|
23
|
+
# Can't make these protected, because that prevents BaseImporter from seeing them.
|
24
|
+
# protected
|
25
|
+
|
26
|
+
# BaseImporter callback
|
27
|
+
def to_search_params(doc_ipr, context)
|
28
|
+
{
|
29
|
+
'si' => context['serviceInstance'].key,
|
30
|
+
'name' => doc_ipr['name']
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
# BaseImporter callback
|
35
|
+
def find_resource(search_params)
|
36
|
+
si = search_params['si']
|
37
|
+
name = search_params['name']
|
38
|
+
@search_resource.findByServiceInstanceKeyAndName(si: si, name: name).get
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class Seiso::ImportMaster
|
2
|
+
class Importers::LoadBalancerImporter < Importers::BaseImporter
|
3
|
+
|
4
|
+
def initialize(api, rest_util, resolver)
|
5
|
+
self.api = api
|
6
|
+
self.rest_util = rest_util
|
7
|
+
self.mapper = Mappers::LoadBalancerMapper.new resolver
|
8
|
+
self.repo_resource = api.loadBalancers.get
|
9
|
+
|
10
|
+
@search_resource = repo_resource.search.get
|
11
|
+
end
|
12
|
+
|
13
|
+
def import(doc)
|
14
|
+
import_items(doc['items'], {})
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_search_params(doc_lb, context)
|
18
|
+
{ 'name' => doc_lb['name'] }
|
19
|
+
end
|
20
|
+
|
21
|
+
def find_resource(search_params)
|
22
|
+
@search_resource.findByName(name: search_params['name']).get
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class Seiso::ImportMaster
|
2
|
+
class Importers::MachineImporter < Importers::BaseImporter
|
3
|
+
|
4
|
+
def initialize(api, rest_util, resolver)
|
5
|
+
self.api = api
|
6
|
+
self.rest_util = rest_util
|
7
|
+
self.mapper = Mappers::MachineMapper.new resolver
|
8
|
+
self.repo_resource = api.machines.get
|
9
|
+
|
10
|
+
@search_resource = repo_resource.search.get
|
11
|
+
end
|
12
|
+
|
13
|
+
def import(doc)
|
14
|
+
import_items(doc['items'], {})
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_search_params(doc_machine, context)
|
18
|
+
{ 'name' => doc_machine['name'] }
|
19
|
+
end
|
20
|
+
|
21
|
+
def find_resource(search_params)
|
22
|
+
@search_resource.findByName(name: search_params['name']).get
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -1,69 +1,107 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
# Author:: Willie Wheeler (mailto:wwheeler@expedia.com)
|
14
|
-
# Copyright:: Copyright (c) 2014-2015 Expedia, Inc.
|
15
|
-
# License:: Apache 2.0
|
16
|
-
class NodeImporter < BaseImporter
|
17
|
-
|
18
|
-
def initialize(mapper, uri_factory_v1, rest_connector_v1)
|
19
|
-
@mapper = mapper
|
20
|
-
@uri_factory_v1 = uri_factory_v1
|
21
|
-
@rest_connector_v1 = rest_connector_v1
|
22
|
-
end
|
1
|
+
class Seiso::ImportMaster
|
2
|
+
# Imports a node document into Seiso.
|
3
|
+
#
|
4
|
+
# Each node doc corresponds to a service instance. This importer compares the nodes in Seiso with the nodes in the
|
5
|
+
# node doc and removes anything from Seiso that isn't in the node doc. Then it imports the nodes from the node doc
|
6
|
+
# into Seiso.
|
7
|
+
#
|
8
|
+
# Author:: Willie Wheeler (mailto:wwheeler@expedia.com)
|
9
|
+
# Author:: Chris Brown
|
10
|
+
# Copyright:: Copyright (c) 2014-2016 Expedia, Inc.
|
11
|
+
# License:: Apache 2.0
|
12
|
+
class Importers::NodeImporter < Importers::BaseImporter
|
23
13
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
14
|
+
def initialize(api, rest_util, resolver)
|
15
|
+
self.api = api
|
16
|
+
self.rest_util = rest_util
|
17
|
+
self.mapper = Mappers::NodeMapper.new resolver
|
18
|
+
self.repo_resource = api.nodes.get
|
29
19
|
|
30
|
-
|
20
|
+
@validator = Validators::NodeValidator.new
|
21
|
+
@nip_importer = Importers::NodeIpAddressImporter.new(api, rest_util)
|
22
|
+
@search_resource = repo_resource.search.get
|
31
23
|
|
32
|
-
|
33
|
-
|
34
|
-
nodes.each do |n|
|
35
|
-
n['serviceInstance'] = si_key
|
36
|
-
end
|
24
|
+
@machine_search_resource = api.machines.search.get
|
25
|
+
end
|
37
26
|
|
38
|
-
|
27
|
+
def import(doc)
|
28
|
+
@validator.validate doc
|
29
|
+
doc_nodes = doc['items']
|
30
|
+
si_key = doc['serviceInstance']
|
31
|
+
si_proxy = api.serviceInstances.search.findByKey(key: si_key)
|
32
|
+
si = rest_util.get_or_nil(si_proxy, si_key)
|
39
33
|
|
40
|
-
|
41
|
-
|
42
|
-
|
34
|
+
if si.nil?
|
35
|
+
raise Util::InvalidDocumentError.new "Service instance #{si_key} not found."
|
36
|
+
end
|
43
37
|
|
44
|
-
|
45
|
-
|
38
|
+
seiso_nodes = si.nodes.get
|
39
|
+
delete_orphans(doc_nodes, seiso_nodes)
|
40
|
+
import_items(doc_nodes, { 'serviceInstance' => si })
|
41
|
+
end
|
46
42
|
|
47
|
-
|
43
|
+
# Can't make these protected, because that prevents BaseImporter from seeing them.
|
44
|
+
# protected
|
48
45
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
46
|
+
# BaseImporter callback
|
47
|
+
def to_search_params(doc_node, context)
|
48
|
+
{ 'name' => doc_node['name'] }
|
49
|
+
end
|
50
|
+
|
51
|
+
# BaseImporter callback
|
52
|
+
def find_resource(search_params)
|
53
|
+
@search_resource.findByName(name: search_params['name']).get
|
54
|
+
end
|
55
|
+
|
56
|
+
# BaseImporter callback
|
57
|
+
def context_for(parent_resource, parent_context)
|
58
|
+
{
|
59
|
+
'serviceInstance' => parent_context['serviceInstance'],
|
60
|
+
'node' => parent_resource
|
61
|
+
}
|
62
|
+
end
|
53
63
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
64
|
+
# BaseImporter callback
|
65
|
+
def import_children_of(doc_node, context)
|
66
|
+
doc_nips = doc_node['ipAddresses']
|
67
|
+
|
68
|
+
# If there aren't any IP addresses explicitly set, then derive one from the machine.
|
69
|
+
if doc_nips.nil? || doc_nips.empty?
|
70
|
+
doc_nips = create_default_doc_nips(doc_node, context)
|
71
|
+
end
|
72
|
+
|
73
|
+
@nip_importer.import_items(doc_nips, context)
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def delete_orphans(doc_nodes, seiso_nodes)
|
79
|
+
doc_node_names = doc_nodes.map { |doc_node| doc_node['name'] }
|
80
|
+
seiso_nodes.each do |seiso_node|
|
81
|
+
orphan = !doc_node_names.include?(seiso_node.name)
|
82
|
+
if orphan
|
83
|
+
params = { 'name' => seiso_node.name }
|
84
|
+
rest_util.delete(seiso_node, params)
|
65
85
|
end
|
66
86
|
end
|
67
87
|
end
|
68
|
-
|
88
|
+
|
89
|
+
def create_default_doc_nips(doc_node, context)
|
90
|
+
node_name = doc_node['name']
|
91
|
+
machine_name = doc_node['machine']
|
92
|
+
machine_search_params = { 'name' => machine_name }
|
93
|
+
machine_proxy = @machine_search_resource.findByName machine_search_params
|
94
|
+
machine_resource = @rest_util.get_or_nil(machine_proxy, machine_search_params)
|
95
|
+
|
96
|
+
if machine_resource.nil?
|
97
|
+
err_msg = "Node #{node_name} references nonexistent machine #{machine_name}."
|
98
|
+
fail Util::InvalidDocumentError.new err_msg
|
99
|
+
end
|
100
|
+
|
101
|
+
[ {
|
102
|
+
'ipAddressRole' => 'default',
|
103
|
+
'ipAddress' => machine_resource.body['ipAddress']
|
104
|
+
} ]
|
105
|
+
end
|
106
|
+
end
|
69
107
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
class Seiso::ImportMaster
|
2
|
+
# Imports a node IP address into Seiso.
|
3
|
+
#
|
4
|
+
# Author:: Willie Wheeler (mailto:wwheeler@expedia.com)
|
5
|
+
# Copyright:: Copyright (c) 2014-2016 Expedia, Inc.
|
6
|
+
# License:: Apache 2.0
|
7
|
+
class Importers::NodeIpAddressImporter < Importers::BaseImporter
|
8
|
+
|
9
|
+
def initialize(api, rest_util)
|
10
|
+
self.api = api
|
11
|
+
self.rest_util = rest_util
|
12
|
+
self.mapper = Mappers::NodeIpAddressMapper.new api
|
13
|
+
self.repo_resource = api.nodeIpAddresses.get
|
14
|
+
|
15
|
+
@search_resource = repo_resource.search.get
|
16
|
+
end
|
17
|
+
|
18
|
+
# Can't make these protected, because that prevents BaseImporter from seeing them.
|
19
|
+
# protected
|
20
|
+
|
21
|
+
# BaseImporter callback
|
22
|
+
def to_search_params(doc_nip, context)
|
23
|
+
|
24
|
+
# FIXME For new nodes, we shouldn't have to look these up at all: nodes own NIPs, so the NIPs would be new too.
|
25
|
+
# So there ought to be a way to suppress NIP do-we-post-or-put lookups when we already know that we're creating a
|
26
|
+
# new node (and hence NIP).
|
27
|
+
#
|
28
|
+
# There is a case where we do need to look up the NIP. It's where we have an existing NIP and we want to change
|
29
|
+
# the IP address role. This feels a little weird to me since it seems like NIPs ought to be identified by
|
30
|
+
# <node, ipAddressRole> rathen than by <node, ipAddress>, but that's not how we've been doing it. [WLW]
|
31
|
+
|
32
|
+
{
|
33
|
+
'node' => context['node'].name,
|
34
|
+
'ipAddress' => doc_nip['ipAddress']
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
# BaseImporter callback
|
39
|
+
def find_resource(search_params)
|
40
|
+
node = search_params['node']
|
41
|
+
ip_addr = search_params['ipAddress']
|
42
|
+
# The .get is necessary to replace the finder URI with the canonical URI.
|
43
|
+
@search_resource.findByNodeNameAndIpAddress(node: node, ipAddress: ip_addr).get
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class Seiso::ImportMaster
|
2
|
+
class Importers::RegionImporter < Importers::BaseImporter
|
3
|
+
|
4
|
+
def initialize(api, rest_util, resolver)
|
5
|
+
@log = Util::Logger.new "RegionImporter"
|
6
|
+
|
7
|
+
self.api = api
|
8
|
+
self.rest_util = rest_util
|
9
|
+
self.mapper = Mappers::RegionMapper.new resolver
|
10
|
+
self.repo_resource = api.regions.get
|
11
|
+
|
12
|
+
@log.info "Getting /regions/search"
|
13
|
+
@search_resource = repo_resource.search.get
|
14
|
+
end
|
15
|
+
|
16
|
+
def import(doc)
|
17
|
+
@log.info "Importing regions"
|
18
|
+
import_items(doc['items'], {})
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_search_params(doc_region, context)
|
22
|
+
{ 'key' => doc_region['key'] }
|
23
|
+
end
|
24
|
+
|
25
|
+
def find_resource(search_params)
|
26
|
+
key = search_params['key']
|
27
|
+
@log.info "Getting /regions/search/findByKey?key=#{key}"
|
28
|
+
@search_resource.findByKey(key: key).get
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|