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.
Files changed (63) hide show
  1. checksums.yaml +8 -8
  2. data/.gitignore +1 -0
  3. data/.travis.yml +3 -0
  4. data/README.md +12 -11
  5. data/Rakefile +3 -3
  6. data/bin/seiso-import-master +30 -13
  7. data/lib/seiso/import_master.rb +114 -90
  8. data/lib/seiso/import_master/importers.rb +5 -0
  9. data/lib/seiso/import_master/importers/base_importer.rb +91 -30
  10. data/lib/seiso/import_master/importers/data_center_importer.rb +31 -0
  11. data/lib/seiso/import_master/importers/environment_importer.rb +25 -0
  12. data/lib/seiso/import_master/importers/health_status_importer.rb +25 -0
  13. data/lib/seiso/import_master/importers/infrastructure_provider_importer.rb +25 -0
  14. data/lib/seiso/import_master/importers/ip_address_role_importer.rb +41 -0
  15. data/lib/seiso/import_master/importers/load_balancer_importer.rb +25 -0
  16. data/lib/seiso/import_master/importers/machine_importer.rb +25 -0
  17. data/lib/seiso/import_master/importers/node_importer.rb +94 -56
  18. data/lib/seiso/import_master/importers/node_ip_address_importer.rb +46 -0
  19. data/lib/seiso/import_master/importers/region_importer.rb +31 -0
  20. data/lib/seiso/import_master/importers/rotation_status_importer.rb +25 -0
  21. data/lib/seiso/import_master/importers/service_group_importer.rb +25 -0
  22. data/lib/seiso/import_master/importers/service_importer.rb +38 -143
  23. data/lib/seiso/import_master/importers/service_instance_importer.rb +60 -213
  24. data/lib/seiso/import_master/importers/service_instance_port_importer.rb +41 -0
  25. data/lib/seiso/import_master/importers/service_type_importer.rb +25 -0
  26. data/lib/seiso/import_master/importers/status_type_importer.rb +25 -0
  27. data/lib/seiso/import_master/mappers.rb +1 -0
  28. data/lib/seiso/import_master/mappers/data_center_mapper.rb +19 -0
  29. data/lib/seiso/import_master/mappers/environment_mapper.rb +20 -0
  30. data/lib/seiso/import_master/mappers/health_status_mapper.rb +20 -0
  31. data/lib/seiso/import_master/mappers/infrastructure_provider_mapper.rb +18 -0
  32. data/lib/seiso/import_master/mappers/ip_address_role_mapper.rb +18 -0
  33. data/lib/seiso/import_master/mappers/load_balancer_mapper.rb +21 -0
  34. data/lib/seiso/import_master/mappers/machine_mapper.rb +27 -0
  35. data/lib/seiso/import_master/mappers/node_ip_address_mapper.rb +38 -0
  36. data/lib/seiso/import_master/mappers/node_mapper.rb +31 -31
  37. data/lib/seiso/import_master/mappers/region_mapper.rb +20 -0
  38. data/lib/seiso/import_master/mappers/rotation_status_mapper.rb +20 -0
  39. data/lib/seiso/import_master/mappers/service_group_mapper.rb +18 -0
  40. data/lib/seiso/import_master/mappers/service_instance_mapper.rb +26 -73
  41. data/lib/seiso/import_master/mappers/service_instance_port_mapper.rb +19 -0
  42. data/lib/seiso/import_master/mappers/service_mapper.rb +23 -32
  43. data/lib/seiso/import_master/mappers/service_type_mapper.rb +19 -0
  44. data/lib/seiso/import_master/mappers/status_type_mapper.rb +18 -0
  45. data/lib/seiso/import_master/util.rb +1 -0
  46. data/lib/seiso/import_master/util/invalid_document_error.rb +9 -0
  47. data/lib/seiso/import_master/util/item_resolver.rb +54 -0
  48. data/lib/seiso/import_master/util/logger.rb +59 -0
  49. data/lib/seiso/import_master/util/rest_util.rb +49 -0
  50. data/lib/seiso/import_master/validators.rb +1 -0
  51. data/lib/seiso/import_master/validators/base_validator.rb +11 -18
  52. data/lib/seiso/import_master/validators/node_validator.rb +54 -45
  53. data/lib/seiso/import_master/validators/service_validator.rb +38 -44
  54. data/sample_conf/seiso3.yml.sample +6 -0
  55. data/seiso-import_master.gemspec +16 -13
  56. data/test/seiso/import_master/importers/test_node_importer.rb +21 -0
  57. metadata +66 -21
  58. data/lib/seiso/import_master/errors/invalid_document_error.rb +0 -11
  59. data/lib/seiso/import_master/importers/simple_importer.rb +0 -28
  60. data/lib/seiso/import_master/mappers/master_item_mapper.rb +0 -194
  61. data/sample_conf/seiso.yml.sample +0 -9
  62. data/test/test_master_item_mapper.rb +0 -257
  63. data/test/test_node_mapper.rb +0 -40
@@ -0,0 +1,41 @@
1
+ # TODO Reinstate the autocreation that Chris Brown wrote
2
+
3
+ class Seiso::ImportMaster
4
+ # Imports service instance ports into Seiso. This importer handles:
5
+ # - orphan removal
6
+ # - POSTing new ports
7
+ # - PUTting existing ports
8
+ #
9
+ # Author:: Willie Wheeler
10
+ # Copyright:: Copyright (c) 2014-2016 Expedia, Inc.
11
+ # License:: Apache 2.0
12
+ class Importers::ServiceInstancePortImporter < Importers::BaseImporter
13
+
14
+ def initialize(api, rest_util)
15
+ self.api = api
16
+ self.rest_util = rest_util
17
+ self.mapper = Mappers::ServiceInstancePortMapper.new
18
+ self.repo_resource = api.serviceInstancePorts.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_sip, context)
28
+ {
29
+ 'si' => context['serviceInstance'].key,
30
+ 'number' => doc_sip['number']
31
+ }
32
+ end
33
+
34
+ # BaseImporter callback
35
+ def find_resource(search_params)
36
+ si = search_params['si']
37
+ number = search_params['number']
38
+ @search_resource.findByServiceInstanceKeyAndNumber(si: si, number: number).get
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,25 @@
1
+ class Seiso::ImportMaster
2
+ class Importers::ServiceTypeImporter < Importers::BaseImporter
3
+
4
+ def initialize(api, rest_util, resolver)
5
+ self.api = api
6
+ self.rest_util = rest_util
7
+ self.mapper = Mappers::ServiceTypeMapper.new resolver
8
+ self.repo_resource = api.serviceTypes.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_st, context)
18
+ { 'key' => doc_st['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::StatusTypeImporter < Importers::BaseImporter
3
+
4
+ def initialize(api, rest_util, resolver)
5
+ self.api = api
6
+ self.rest_util = rest_util
7
+ self.mapper = Mappers::StatusTypeMapper.new resolver
8
+ self.repo_resource = api.statusTypes.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_st, context)
18
+ { 'key' => doc_st['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 @@
1
+ module Seiso::ImportMaster::Mappers; end
@@ -0,0 +1,19 @@
1
+ class Seiso::ImportMaster
2
+ # Author:: Willie Wheeler
3
+ # Copyright:: Copyright (c) 2014-2016 Expedia, Inc.
4
+ # License:: Apache 2.0
5
+ class Mappers::DataCenterMapper
6
+
7
+ def initialize(resolver)
8
+ @resolver = resolver
9
+ end
10
+
11
+ def map(doc_dc, context)
12
+ {
13
+ 'key' => doc_dc['key'],
14
+ 'name' => doc_dc['name'],
15
+ 'region' => @resolver.item_uri('regions', doc_dc['region'])
16
+ }
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,20 @@
1
+ class Seiso::ImportMaster
2
+ # Author:: Willie Wheeler
3
+ # Copyright:: Copyright (c) 2014-2016 Expedia, Inc.
4
+ # License:: Apache 2.0
5
+ class Mappers::EnvironmentMapper
6
+
7
+ def initialize(resolver)
8
+ @resolver = resolver
9
+ end
10
+
11
+ def map(doc_env, context)
12
+ {
13
+ 'key' => doc_env['key'],
14
+ 'name' => doc_env['name'],
15
+ 'aka' => doc_env['aka'],
16
+ 'description' => doc_env['description']
17
+ }
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ class Seiso::ImportMaster
2
+ # Author:: Willie Wheeler
3
+ # Copyright:: Copyright (c) 2014-2016 Expedia, Inc.
4
+ # License:: Apache 2.0
5
+ class Mappers::HealthStatusMapper
6
+
7
+ def initialize(resolver)
8
+ @resolver = resolver
9
+ end
10
+
11
+ def map(doc_hs, context)
12
+ {
13
+ 'key' => doc_hs['key'],
14
+ 'name' => doc_hs['name'],
15
+ 'description' => doc_hs['description'],
16
+ 'statusType' => @resolver.item_uri('statusTypes', doc_hs['statusType'])
17
+ }
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,18 @@
1
+ class Seiso::ImportMaster
2
+ # Author:: Willie Wheeler
3
+ # Copyright:: Copyright (c) 2014-2016 Expedia, Inc.
4
+ # License:: Apache 2.0
5
+ class Mappers::InfrastructureProviderMapper
6
+
7
+ def initialize(resolver)
8
+ @resolver = resolver
9
+ end
10
+
11
+ def map(doc_ip, context)
12
+ {
13
+ 'key' => doc_ip['key'],
14
+ 'name' => doc_ip['name']
15
+ }
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ class Seiso::ImportMaster
2
+ # Maps a SDM IP address role to a Seiso IP address role.
3
+ #
4
+ # Author:: Willie Wheeler
5
+ # Copyright:: Copyright (c) 2014-2016 Expedia, Inc.
6
+ # License:: Apache 2.0
7
+ class Mappers::IpAddressRoleMapper
8
+
9
+ def map(doc_ipr, context)
10
+ si_uri = context['serviceInstance'].href
11
+ {
12
+ 'serviceInstance' => si_uri,
13
+ 'name' => doc_ipr['name'],
14
+ 'description' => doc_ipr['description']
15
+ }
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,21 @@
1
+ class Seiso::ImportMaster
2
+ # Author:: Willie Wheeler
3
+ # Copyright:: Copyright (c) 2014-2016 Expedia, Inc.
4
+ # License:: Apache 2.0
5
+ class Mappers::LoadBalancerMapper
6
+
7
+ def initialize(resolver)
8
+ @resolver = resolver
9
+ end
10
+
11
+ def map(doc_lb, context)
12
+ {
13
+ 'name' => doc_lb['name'],
14
+ 'type' => doc_lb['type'],
15
+ 'ipAddress' => doc_lb['ipAddress'],
16
+ 'apiUrl' => doc_lb['apiUrl'],
17
+ 'dataCenter' => @resolver.item_uri('dataCenters', doc_lb['dataCenter'])
18
+ }
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,27 @@
1
+ class Seiso::ImportMaster
2
+ # Author:: Willie Wheeler
3
+ # Copyright:: Copyright (c) 2014-2016 Expedia, Inc.
4
+ # License:: Apache 2.0
5
+ class Mappers::MachineMapper
6
+
7
+ def initialize(resolver)
8
+ @resolver = resolver
9
+ end
10
+
11
+ def map(doc_machine, context)
12
+ # TODO Add data center here?
13
+ {
14
+ 'name' => doc_machine['name'],
15
+ 'os' => doc_machine['os'],
16
+ 'osVersion' => doc_machine['osVersion'],
17
+ 'platform' => doc_machine['platform'],
18
+ 'platformVersion' => doc_machine['platformVersion'],
19
+ 'hostname' => doc_machine['hostname'],
20
+ 'domain' => doc_machine['domain'],
21
+ 'fqdn' => doc_machine['fqdn'],
22
+ 'ipAddress' => doc_machine['ipAddress'],
23
+ 'ip6Address' => doc_machine['ip6Address']
24
+ }
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,38 @@
1
+ class Seiso::ImportMaster
2
+ # Author:: Willie Wheeler
3
+ # Copyright:: Copyright (c) 2014-2016 Expedia, Inc.
4
+ # License:: Apache 2.0
5
+ class Mappers::NodeIpAddressMapper
6
+
7
+ def initialize(api)
8
+ @api = api
9
+ @ipr_search_resource = api.ipAddressRoles.search.get
10
+ end
11
+
12
+ def map(doc_nip, context)
13
+ node = context['node']
14
+ si_key = context['serviceInstance'].body['key']
15
+ ipr_name = doc_nip['ipAddressRole']
16
+ ip_addr = doc_nip['ipAddress']
17
+
18
+ # TODO Verify that the API assigns the rotationStatus and aggregateRotationStatus to "unknown" in the POST case.
19
+ # See node_mapper.rb
20
+ {
21
+ 'node' => node.links.self.href,
22
+ # Can't use UriResolver here since ipr requires two keys.
23
+ 'ipAddressRole' => to_ip_address_role(si_key, ipr_name).links.self.href,
24
+ 'ipAddress' => ip_addr
25
+ }
26
+ end
27
+
28
+ private
29
+
30
+ def to_ip_address_role(si_key, ipr_name)
31
+ search_params = { 'si' => si_key, 'name' => ipr_name }
32
+
33
+ # TODO Handle 404. But shouldn't get them if the data is good, so
34
+ # make sure we're importing the IP address roles before the nodes.
35
+ @ipr_search_resource.findByServiceInstanceKeyAndName(search_params).get
36
+ end
37
+ end
38
+ end
@@ -1,33 +1,33 @@
1
- module Seiso
2
- class ImportMaster
3
- module Mappers
4
-
5
- # Maps a SDM node to a Seiso node.
6
- #
7
- # Author:: Willie Wheeler
8
- # Copyright:: Copyright (c) 2014-2015 Expedia, Inc.
9
- # License:: Apache 2.0
10
- class NodeMapper
1
+ class Seiso::ImportMaster
2
+ # Author:: Willie Wheeler
3
+ # Copyright:: Copyright (c) 2014-2016 Expedia, Inc.
4
+ # License:: Apache 2.0
5
+ class Mappers::NodeMapper
11
6
 
12
- def seiso_node(n)
13
- seiso_node = {
14
- 'name' => n['name'],
15
- 'serviceInstance' => { 'key' => n['serviceInstance'] }
16
- }
17
- machine = n['machine']
18
- seiso_node['machine'] = { 'name' => machine } unless machine.nil?
19
- seiso_node
20
- end
21
-
22
- def seiso_nip(nip)
23
- # No rotation status or endpoints since we don't import those from master files.
24
- {
25
- 'node' => { 'name' => nip['node'] },
26
- 'ipAddressRole' => { 'name' => nip['ipAddressRole'] },
27
- 'ipAddress' => nip['ipAddress']
28
- }
29
- end
30
- end
31
- end
32
- end
7
+ def initialize(resolver)
8
+ @resolver = resolver
9
+ @health_unknown = @resolver.item_uri('healthStatuses', 'unknown')
10
+ @rotation_unknown = @resolver.item_uri('rotationStatuses', 'unknown')
11
+ end
12
+
13
+ # TODO Need to map POSTs and PATCHes differently.
14
+ # POSTs should contain unknown statuses. PATCHes shouldn't.
15
+
16
+ # TODO Do we even need to provide the unknowns here?
17
+ # Doesn't/shouldn't the API automatically set this?
18
+
19
+ # Maps a document node to a Seiso node. Does *not* map state-related fields, such as buildVersion, healthStatus and
20
+ # aggregateRotationStatus.
21
+ #
22
+ # - doc_node : document node
23
+ def map(doc_node, context)
24
+ {
25
+ 'name' => doc_node['name'],
26
+ 'description' => doc_node['description'],
27
+ 'serviceInstance' => context['serviceInstance'].self.href,
28
+ 'machine' => @resolver.item_uri('machines', doc_node['machine'])
29
+ # 'healthStatus' => @health_unknown
30
+ }
31
+ end
32
+ end
33
33
  end
@@ -0,0 +1,20 @@
1
+ class Seiso::ImportMaster
2
+ # Author:: Willie Wheeler
3
+ # Copyright:: Copyright (c) 2014-2016 Expedia, Inc.
4
+ # License:: Apache 2.0
5
+ class Mappers::RegionMapper
6
+
7
+ def initialize(resolver)
8
+ @resolver = resolver
9
+ end
10
+
11
+ def map(doc_region, context)
12
+ {
13
+ 'key' => doc_region['key'],
14
+ 'name' => doc_region['name'],
15
+ 'regionKey' => doc_region['regionKey'],
16
+ 'infrastructureProvider' => @resolver.item_uri('infrastructureProviders', doc_region['infrastructureProvider'])
17
+ }
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ class Seiso::ImportMaster
2
+ # Author:: Willie Wheeler
3
+ # Copyright:: Copyright (c) 2014-2016 Expedia, Inc.
4
+ # License:: Apache 2.0
5
+ class Mappers::RotationStatusMapper
6
+
7
+ def initialize(resolver)
8
+ @resolver = resolver
9
+ end
10
+
11
+ def map(doc_rs, context)
12
+ {
13
+ 'key' => doc_rs['key'],
14
+ 'name' => doc_rs['name'],
15
+ 'description' => doc_rs['description'],
16
+ 'statusType' => @resolver.item_uri('statusTypes', doc_rs['statusType'])
17
+ }
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,18 @@
1
+ class Seiso::ImportMaster
2
+ # Author:: Willie Wheeler
3
+ # Copyright:: Copyright (c) 2014-2016 Expedia, Inc.
4
+ # License:: Apache 2.0
5
+ class Mappers::ServiceGroupMapper
6
+
7
+ def initialize(resolver)
8
+ @resolver = resolver
9
+ end
10
+
11
+ def map(doc_sg, context)
12
+ {
13
+ 'key' => doc_sg['key'],
14
+ 'name' => doc_sg['name']
15
+ }
16
+ end
17
+ end
18
+ end
@@ -1,76 +1,29 @@
1
- module Seiso
2
- class ImportMaster
3
- module Mappers
1
+ class Seiso::ImportMaster
2
+ # Maps a SDM service instance to a Seiso service instance.
3
+ #
4
+ # Author:: Willie Wheeler
5
+ # Copyright:: Copyright (c) 2014-2016 Expedia, Inc.
6
+ # License:: Apache 2.0
7
+ class Mappers::ServiceInstanceMapper
4
8
 
5
- # Maps a SDM service instance to a Seiso service instance.
6
- #
7
- # Author:: Willie Wheeler
8
- # Copyright:: Copyright (c) 2014-2015 Expedia, Inc.
9
- # License:: Apache 2.0
10
- class ServiceInstanceMapper
9
+ def initialize(resolver)
10
+ @resolver = resolver
11
+ end
11
12
 
12
- def seiso_ip_address_role(r)
13
- # Suppressing IP addresses since we don't import those from master files.
14
- {
15
- 'serviceInstance' => { 'key' => r['serviceInstance'] },
16
- 'name' => r['name'],
17
- 'description' => r['description']
18
- }
19
- end
20
-
21
- def seiso_service_instance(si)
22
- key = si['key']
23
- ip_address_roles = si['ipAddressRoles']
24
- ports = si['ports']
25
-
26
- seiso_si = {
27
- 'key' => key,
28
- 'description' => si['description'],
29
- 'service' => { 'key' => si['service'] },
30
- 'environment' => { 'key' => si['environment'] },
31
- 'loadBalanced' => si['loadBalanced'],
32
- 'minCapacityDeploy' => si['minCapacityDeploy'],
33
- 'minCapacityOps' => si['minCapacityOps'],
34
-
35
- # FIXME Deprecated. This is a hardcoded field for an internal Expedia app, and we will remove it.
36
- 'eosManaged' => (si['eosManaged'] || false),
37
-
38
- # FIXME Deprecated. This is the old name for the minCapacityOps field.
39
- 'requiredCapacity' => si['minCapacityOps']
40
- }
41
-
42
- data_center = si['dataCenter']
43
- seiso_si['dataCenter'] = { 'key' => data_center } unless data_center.nil?
44
-
45
- load_balancer = si['loadBalancer']
46
- seiso_si['loadBalancer'] = { 'name' => load_balancer } unless load_balancer.nil?
47
-
48
- seiso_si
49
- end
50
-
51
- def seiso_service_instance_port(p)
52
- # Suppressing endpoints since we don't import those from master files.
53
- {
54
- 'serviceInstance' => { 'key' => p['serviceInstance'] },
55
- 'number' => p['number'],
56
- 'protocol' => p['protocol'],
57
- 'description' => p['description']
58
- }
59
- end
60
-
61
- def seiso_service_instance_dependencies(sdm_dependencies)
62
- sdm_dependencies.map do |d|
63
- seiso_service_instance_dependency d
64
- end
65
- end
66
-
67
- def seiso_service_instance_dependency(d)
68
- {
69
- 'dependent' => { 'key' => d['serviceInstance'] },
70
- 'dependency' => { 'key' => d['key'] }
71
- }
72
- end
73
- end
74
- end
75
- end
13
+ def map(si, context)
14
+ {
15
+ 'key' => si['key'],
16
+ 'description' => si['description'],
17
+ 'service' => @resolver.item_uri('services', si['service']),
18
+ 'environment' => @resolver.item_uri('environments', si['environment']),
19
+ 'dataCenter' => @resolver.item_uri('dataCenters', si['dataCenter']),
20
+ 'loadBalancer' => @resolver.item_uri('loadBalancers', si['loadBalancer']),
21
+ 'loadBalanced' => si['loadBalanced'],
22
+ 'minCapacityDeploy' => si['minCapacityDeploy'],
23
+ 'minCapacityOps' => si['minCapacityOps'],
24
+ # TODO Deprecated
25
+ 'eosManaged' => si['eosManaged']
26
+ }
27
+ end
28
+ end
76
29
  end