seiso-import_master 0.0.7 → 0.0.8

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 CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZTRjZDQ3YzYzOWUyOTdjYWY2MTc0ZGIxM2E0YTI4OGQ3ZTAzOWRjNw==
4
+ ZTA3MTk0YTNlYzIxMDM3MzhlNTMwYWFhMGRiNzVhODU5MmYyZDc2Ng==
5
5
  data.tar.gz: !binary |-
6
- NzNhOWRlNTNjMGQxZGI1ODhhMzExMzY0ZTdkOWQ4OGM4ZDdlM2RmNg==
6
+ ZGE0MjU4OGIxNWRlYjQyZGY1N2Y5NzMwYjZkOTRlNDg1YzUyOGQ2Mg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- NTY3N2EzOWY2NGY0OGI0N2VmYmMwNTcyMjIwZDI1NDk2Y2MwMDI4NmExZTA4
10
- NWQ5NjJiYjMyZjFmMzk1Y2ZmNmMyMTU1MTk3ZjA0N2YyZGIyNTY1Yzg0ZWRl
11
- Y2M3ZTZlODJmZmRmMzBlNjYyNjkxNjAwZGFhZWE4NWQ5MDM1ZTE=
9
+ NWY0MGZkYjRkYzA1MTNlMDE3NzM1ZDBmM2RiZGE5NDZlY2JlYTY0Yzc2YWIz
10
+ YTliN2E4YjQ0ODYyMzY3MjFkNWE1ZDk0MGI2NjM4YzM1ODk5Yjc0MGRlMjU5
11
+ MmMxODkzYWZjNzVhNGY0ZmJhMTY0NWUyYTYxZTc0OWQzMzA4MGI=
12
12
  data.tar.gz: !binary |-
13
- NTg4MDMxMWMyMjM1NmEwMjUyZWZjZTQ2MDEwYTc0YjM5NjkzMTc4M2VlYWFl
14
- ZWI5ZWYxNGZlYTU2ZTMxNjNiYWE3YjdhNTZmMGNjMGEyMDE2ZTBhMzU0NGYx
15
- NjI1NjJiYjc4NWY0ZDFlYjkzN2ExMDVkNzhjYjA5MDg4MTlkMmU=
13
+ ZjI2MjlhNzIzNWY2NTIzNmY3Y2VhMTlhYTI4ODE2NjRjYjM0MGRiZjRmMzRh
14
+ NTVlMTBmMDZmMjkwZjA0Y2NjMTgxOTJiM2M3ZDZhZWM0ZTQxMjdlYzI4NTI5
15
+ ZGRlNzJjOTAwZmUxMjliNzU4ZmI4ODhmYzllNGEzNzY0MGJjYTM=
@@ -1,7 +1,7 @@
1
1
  require "json"
2
2
  require "require_all"
3
- require "seiso/connector"
4
3
  require "yaml"
4
+ require "seiso/connector"
5
5
 
6
6
  require_rel "import_master"
7
7
 
@@ -39,16 +39,24 @@ module Seiso
39
39
  rest_connector_v2 = rest_connector(seiso_settings, "application/hal+json")
40
40
 
41
41
  @simple_importer = Importers::SimpleImporter.new(basic_mapper, seiso, uri_factory_v1, rest_connector_v1)
42
+
43
+ # TODO Clean this up. Just use v2 URI factory and connector.
42
44
  @importers = {
43
45
  'nodes' => Importers::NodeImporter.new(node_mapper, uri_factory_v1, rest_connector_v1),
44
46
  'services' => Importers::ServiceImporter.new(
45
- service_mapper,
46
47
  basic_mapper,
48
+ service_mapper,
47
49
  uri_factory_v1,
48
50
  uri_factory_v2,
49
51
  rest_connector_v1,
50
52
  rest_connector_v2),
51
- 'service-instances' => Importers::ServiceInstanceImporter.new(service_instance_mapper, seiso, uri_factory_v1, rest_connector_v1)
53
+ 'service-instances' => Importers::ServiceInstanceImporter.new(
54
+ service_instance_mapper,
55
+ uri_factory_v1,
56
+ uri_factory_v2,
57
+ seiso,
58
+ rest_connector_v1,
59
+ rest_connector_v2)
52
60
  }
53
61
  end
54
62
 
@@ -81,7 +89,7 @@ module Seiso
81
89
  use_ssl = settings['use_ssl'] || false
82
90
  scheme = use_ssl ? "https" : "http"
83
91
  base_uri = "#{scheme}://#{host}:#{port}/v1"
84
- Util::UriFactoryV1.new base_uri
92
+ Seiso::Connector::UriFactoryV1.new base_uri
85
93
  end
86
94
 
87
95
  def uri_factory_v2(settings)
@@ -90,7 +98,7 @@ module Seiso
90
98
  use_ssl = settings['use_ssl'] || false
91
99
  scheme = use_ssl ? "https" : "http"
92
100
  base_uri = "#{scheme}://#{host}:#{port}/v2"
93
- Util::UriFactoryV2.new base_uri
101
+ Seiso::Connector::UriFactoryV2.new base_uri
94
102
  end
95
103
 
96
104
  def rest_connector(settings, media_type)
@@ -100,7 +108,7 @@ module Seiso
100
108
  ignore_cert = settings['ignore_cert'] || false
101
109
  username = settings['username']
102
110
  password = settings['password']
103
- Util::RestConnector.new(host, port, use_ssl, ignore_cert, username, password, media_type)
111
+ Seiso::Connector::RestConnector.new(host, port, use_ssl, ignore_cert, username, password, media_type)
104
112
  end
105
113
  end
106
114
  end
@@ -4,6 +4,8 @@ module Seiso
4
4
  class ImportMaster
5
5
  module Importers
6
6
 
7
+ # TODO Clean this up. Just use v2 URI factory and connector.
8
+
7
9
  # Imports a service document into Seiso.
8
10
  #
9
11
  # Author:: Willie Wheeler (mailto:wwheeler@expedia.com)
@@ -12,8 +14,8 @@ module Seiso
12
14
  class ServiceImporter < BaseImporter
13
15
 
14
16
  def initialize(
15
- service_mapper,
16
17
  basic_mapper,
18
+ service_mapper,
17
19
  uri_factory_v1,
18
20
  uri_factory_v2,
19
21
  rest_connector_v1,
@@ -32,32 +34,38 @@ module Seiso
32
34
  services = doc['items']
33
35
  puts "Importing service document"
34
36
 
35
- doc_links = detach_children(services, 'service', 'key', 'docLinks')
37
+ sdm_doc_links = detach_children(services, 'service', 'key', 'docLinks')
36
38
 
37
39
  seiso_services = services.map { |s| @service_mapper.seiso_service s }
38
40
  services_uri = @uri_factory_v1.services_uri true
39
41
  @rest_connector_v1.post(services_uri, seiso_services)
40
42
 
41
- import_doc_links doc_links
43
+ import_doc_links(services, sdm_doc_links)
42
44
  end
43
45
 
44
46
  private
45
47
 
46
- def import_doc_links(doc_links)
47
- doc_links_by_service = group_doc_links_by_service doc_links
48
+ # - services: services
49
+ # - doc_links: SDM doc links
50
+ def import_doc_links(services, doc_links)
48
51
 
49
- doc_links_by_service.each do |service_key, doc_links|
52
+ # We can't simply infer the services from the doc links, because we have to handle the case
53
+ # where we remove all doc links from a service instance that formerly had some.
54
+
55
+ doc_links_by_service = group_doc_links_by_service doc_links
56
+ services.each do |service|
57
+ service_key = service['key']
58
+ service_doc_links = doc_links_by_service[service_key] || []
50
59
  doc_links_uri = @uri_factory_v2.doc_links_uri service_key
51
60
 
52
61
  # Get service's doc links so we can
53
62
  # 1) Delete stale doc links
54
63
  # 2) Avoid duplicate imports
55
- seiso_doc_links_response = @rest_connector_v2.get(doc_links_uri)
56
- seiso_doc_links = JSON.parse(seiso_doc_links_response.body)
57
-
58
- to_delete = seiso_doc_links_to_delete(doc_links, seiso_doc_links)
64
+ seiso_doc_links_response = @rest_connector_v2.get doc_links_uri
65
+ seiso_doc_links = JSON.parse seiso_doc_links_response.body
59
66
 
60
67
  # Delete stale doc links
68
+ to_delete = seiso_doc_links_to_delete(service_doc_links, seiso_doc_links)
61
69
  to_delete.each do |seiso_doc_link|
62
70
  href = seiso_doc_link['_links']['self']['href']
63
71
  uri = URI.parse href
@@ -67,7 +75,7 @@ module Seiso
67
75
  # Classify remaining links as post or put
68
76
  to_post = []
69
77
  to_put = []
70
- doc_links.each do |sdm_doc_link|
78
+ service_doc_links.each do |sdm_doc_link|
71
79
  sdm_title = sdm_doc_link['title']
72
80
  post_it = true
73
81
  seiso_doc_links.each do |seiso_doc_link|
@@ -4,6 +4,10 @@ module Seiso
4
4
  class ImportMaster
5
5
  module Importers
6
6
 
7
+ # TODO Clean this up. Just use v2 URI factory and connector.
8
+ # Right now we're using three separate Seiso connectors (and two versions of the Seiso API)
9
+ # and this sucks. [WLW]
10
+
7
11
  # Imports a service instance document into Seiso.
8
12
  #
9
13
  # Author:: Willie Wheeler (mailto:wwheeler@expedia.com)
@@ -11,30 +15,106 @@ module Seiso
11
15
  # License:: Apache 2.0
12
16
  class ServiceInstanceImporter < BaseImporter
13
17
 
14
- def initialize(mapper, seiso, uri_factory_v1, rest_connector_v1)
15
- @mapper = mapper
16
- @seiso = seiso
18
+ def initialize(
19
+ service_instance_mapper,
20
+ uri_factory_v1,
21
+ uri_factory_v2,
22
+ seiso,
23
+ rest_connector_v1,
24
+ rest_connector_v2)
25
+
26
+ @service_instance_mapper = service_instance_mapper
17
27
  @uri_factory_v1 = uri_factory_v1
28
+ @uri_factory_v2 = uri_factory_v2
29
+ @seiso = seiso
18
30
  @rest_connector_v1 = rest_connector_v1
31
+ @rest_connector_v2 = rest_connector_v2
19
32
  end
20
33
 
21
34
  # Imports the service instance document
22
35
  def import(doc)
23
- service_instances = doc['items']
24
- ports = detach_children(service_instances, 'serviceInstance', 'key', 'ports')
25
- roles = detach_children(service_instances, 'serviceInstance', 'key', 'ipAddressRoles')
36
+ sdm_service_instances = doc['items']
37
+ sdm_ports = detach_children(sdm_service_instances, 'serviceInstance', 'key', 'ports')
38
+ sdm_roles = detach_children(sdm_service_instances, 'serviceInstance', 'key', 'ipAddressRoles')
39
+ sdm_seyren_checks = detach_children(sdm_service_instances, 'serviceInstance', 'key', 'seyrenChecks')
26
40
 
27
- seiso_service_instances = service_instances.map { |si| @mapper.seiso_service_instance si }
41
+ import_service_instances sdm_service_instances
42
+ import_ports sdm_ports
43
+ import_ip_address_roles sdm_roles
44
+ import_seyren_checks sdm_seyren_checks
45
+ end
46
+
47
+ private
48
+
49
+ def import_service_instances(sdm_service_instances)
50
+ seiso_service_instances = sdm_service_instances.map do |si|
51
+ @service_instance_mapper.seiso_service_instance si
52
+ end
28
53
  service_instances_uri = @uri_factory_v1.service_instances_uri true
29
54
  @rest_connector_v1.post(service_instances_uri, seiso_service_instances)
55
+ end
30
56
 
31
- seiso_ports = ports.map { |p| @mapper.seiso_service_instance_port p }
32
- @seiso.post_items('service-instance-ports', seiso_ports)
57
+ def import_ports(sdm_ports)
58
+ seiso_ports = sdm_ports.map do |p|
59
+ @service_instance_mapper.seiso_service_instance_port p
60
+ end
61
+ @seiso.post_items('service-instance-ports', seiso_ports)
62
+ end
33
63
 
34
- seiso_roles = roles.map { |r| @mapper.seiso_ip_address_role r }
35
- @seiso.post_items('ip-address-roles', seiso_roles)
36
- end
37
- end
38
- end
39
- end
40
- end
64
+ def import_ip_address_roles(sdm_roles)
65
+ seiso_roles = sdm_roles.map do |r|
66
+ @service_instance_mapper.seiso_ip_address_role r
67
+ end
68
+ @seiso.post_items('ip-address-roles', seiso_roles)
69
+ end
70
+
71
+ def import_seyren_checks(sdm_checks)
72
+ puts "Importing Seyren checks"
73
+
74
+ # Group checks by service instance
75
+ checks_by_service_instance = {}
76
+ sdm_checks.each do |c|
77
+ si_key = c['serviceInstance']
78
+ checks = checks_by_service_instance[si_key]
79
+ if checks.nil?
80
+ checks = []
81
+ checks_by_service_instance[si_key] = checks
82
+ end
83
+ checks << c
84
+ end
85
+
86
+ # Iterate over service instances, posting the checks for each one.
87
+ # TODO Need to handle stale checks and separate POST/PUT
88
+ checks_by_service_instance.each do |si_key, si_checks|
89
+ puts "Importing Seyren checks: serviceInstance=#{si_key}"
90
+
91
+ # checks_uri is the Seiso collection resource for posting checks to a service instance
92
+ checks_uri = @uri_factory_v2.service_instance_seyren_checks_uri si_key
93
+
94
+ # Build the list of Seiso Seyren check URIs that we want to post to checks_uri
95
+ uri_list = []
96
+ si_checks.each do |sdm_check|
97
+
98
+ # Look up the Seiso Seyren check URI, since we don't know it in advance.
99
+ # If it exists, add it to the URI list.
100
+ seyren_base_url = sdm_check['baseUrl']
101
+ seyren_id = sdm_check['id']
102
+ search_uri = @uri_factory_v2.find_seyren_check_uri(seyren_base_url, seyren_id)
103
+ response = @rest_connector_v2.get search_uri
104
+ if response.code == "200"
105
+ seiso_check = JSON.parse response.body
106
+ uri_list << seiso_check['_links']['self']['href']
107
+ end
108
+ # TODO Log a warning or something if the response code is 404 or other problem.
109
+ end
110
+
111
+ # Post the URI list to checks_uri
112
+ @rest_connector_v2.post_uri_list(checks_uri, uri_list)
113
+ end
114
+
115
+ end
116
+
117
+ end # class ServiceInstanceImporter
118
+ end # module Importers
119
+ end # class ImportMaster
120
+ end # module Seiso
@@ -174,7 +174,7 @@ module Seiso
174
174
  }
175
175
  }
176
176
  end
177
-
177
+
178
178
  def status_type_mapper
179
179
  ->(st) {
180
180
  {
@@ -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"
7
+ spec.version = "0.0.8"
8
8
  spec.authors = ["Willie Wheeler"]
9
9
  spec.email = ["wwheeler@expedia.com"]
10
10
  spec.summary = "Imports Seiso data master files into Seiso."
@@ -22,6 +22,6 @@ Gem::Specification.new do |spec|
22
22
  spec.add_development_dependency "bundler", "~> 1.7"
23
23
  spec.add_development_dependency "rake", "~> 10.0"
24
24
 
25
- spec.add_runtime_dependency "seiso-connector", "~> 0.1.0"
25
+ spec.add_runtime_dependency "seiso-connector", "~> 0.1.6"
26
26
  spec.add_runtime_dependency "require_all", "~> 1.3.2"
27
27
  end
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.7
4
+ version: 0.0.8
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-05-20 00:00:00.000000000 Z
11
+ date: 2015-05-22 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.1.0
47
+ version: 0.1.6
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.1.0
54
+ version: 0.1.6
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: require_all
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -93,9 +93,6 @@ files:
93
93
  - lib/seiso/import_master/mappers/node_mapper.rb
94
94
  - lib/seiso/import_master/mappers/service_instance_mapper.rb
95
95
  - lib/seiso/import_master/mappers/service_mapper.rb
96
- - lib/seiso/import_master/util/rest_connector.rb
97
- - lib/seiso/import_master/util/uri_factory_v1.rb
98
- - lib/seiso/import_master/util/uri_factory_v2.rb
99
96
  - lib/seiso/import_master/validators/base_validator.rb
100
97
  - lib/seiso/import_master/validators/node_validator.rb
101
98
  - lib/seiso/import_master/validators/service_validator.rb
@@ -1,102 +0,0 @@
1
- require "json"
2
- require "net/http"
3
- require "openssl"
4
-
5
- module Seiso
6
- class ImportMaster
7
- module Util
8
-
9
- # Author:: Willie Wheeler (mailto:wwheeler@expedia.com)
10
- # Copyright:: Copyright (c) 2014-2015 Expedia, Inc.
11
- # License:: Apache 2.0
12
- class RestConnector
13
- HN_ACCEPT = "Accept"
14
- HN_CONTENT_TYPE = "Content-Type"
15
-
16
- def initialize(host, port, use_ssl, ignore_cert, username, password, media_type)
17
- @host = host
18
- @port = port
19
- @use_ssl = use_ssl
20
- @ignore_cert = ignore_cert
21
- @username = username
22
- @password = password
23
- @media_type = media_type
24
-
25
- # FIXME Not secure
26
- @verify_mode = OpenSSL::SSL::VERIFY_NONE if @use_ssl
27
- end
28
-
29
- def get(uri)
30
- request = Net::HTTP::Get.new uri.request_uri
31
- request[HN_ACCEPT] = @media_type
32
- request.basic_auth(@username, @password)
33
- do_request(http, request)
34
- end
35
-
36
- def post(uri, resource)
37
- request = Net::HTTP::Post.new uri.request_uri
38
- request[HN_CONTENT_TYPE] = @media_type
39
- request.basic_auth(@username, @password)
40
- request.body = resource.to_json
41
- do_request(http, request)
42
- end
43
-
44
- # Puts all resources using a keepalive connection
45
- def put_all(uri_resource_pairs)
46
- Net::HTTP.start(
47
- @host,
48
- @port,
49
- :use_ssl => @use_ssl,
50
- :verify_mode => @verify_mode) do |http|
51
-
52
- uri_resource_pairs.each do |pair|
53
- pair_uri = pair['uri']
54
- pair_resource = pair['resource']
55
- request = Net::HTTP::Put.new pair_uri.request_uri
56
- request[HN_CONTENT_TYPE] = @media_type
57
- request.basic_auth(@username, @password)
58
- request.body = pair_resource.to_json
59
- do_request(http, request)
60
- end
61
- end
62
- end
63
-
64
- def put(uri, resource)
65
- request = Net::HTTP::Put.new uri.request_uri
66
- request[HN_CONTENT_TYPE] = @media_type
67
- request.basic_auth(@username, @password)
68
- request.body = resource.to_json
69
- do_request(http, request)
70
- end
71
-
72
- def delete(uri)
73
- puts "DELETE #{uri}"
74
- request = Net::HTTP::Delete.new uri.request_uri
75
- request.basic_auth(@username, @password)
76
- do_request(http, request)
77
- end
78
-
79
- private
80
-
81
- def http
82
- # Not sure if I can reuse this, so for now I'm just creating a new one every time.
83
- http = Net::HTTP.new(@host, @port)
84
- http.use_ssl = @use_ssl
85
- http.verify_mode = @verify_mode
86
- http
87
- end
88
-
89
- def do_request(http, request)
90
- response = http.request request
91
-
92
- if response.code.start_with?("4") || response.code.start_with?("5")
93
- details = "(#{JSON.parse response.body})"
94
- end
95
- puts "#{request.method} #{request.path} => #{response.code} #{response.message} #{details}"
96
- response
97
- end
98
-
99
- end # class RestConnector
100
- end # module Util
101
- end # class ImportMaster
102
- end # module Seiso
@@ -1,61 +0,0 @@
1
- require "uri"
2
-
3
- module Seiso
4
- class ImportMaster
5
- module Util
6
-
7
- # Seiso API v1 URI factory.
8
- #
9
- # URI templating (embodied here) is a temporary strategy for obtaining URIs. The plan is
10
- # to adopt something like a Traverson-style strategy.
11
- #
12
- # Author:: Willie Wheeler (mailto:wwheeler@expedia.com)
13
- # Copyright:: Copyright (c) 2014-2015 Expedia, Inc.
14
- # License:: Apache 2.0
15
- class UriFactoryV1
16
-
17
- def initialize(base_uri)
18
- @base_uri = base_uri
19
- end
20
-
21
- def nodes_uri(batch)
22
- if batch
23
- uri "/nodes?mode=batch"
24
- else
25
- uri "/nodes"
26
- end
27
- end
28
-
29
- def node_uri(name)
30
- uri "/nodes/#{name}"
31
- end
32
-
33
- def node_ip_address_uri(node_name, ip_address)
34
- uri "/nodes/#{node_name}/ip-addresses/#{ip_address}"
35
- end
36
-
37
- def services_uri(batch)
38
- if batch
39
- uri "/services?mode=batch"
40
- else
41
- uri "/services"
42
- end
43
- end
44
-
45
- def service_instances_uri(batch)
46
- if batch
47
- uri "/service-instances?mode=batch"
48
- else
49
- uri "/service-instances"
50
- end
51
- end
52
-
53
- private
54
-
55
- def uri(path)
56
- URI.parse "#{@base_uri}#{path}"
57
- end
58
- end
59
- end
60
- end
61
- end
@@ -1,34 +0,0 @@
1
- require "uri"
2
-
3
- module Seiso
4
- class ImportMaster
5
- module Util
6
-
7
- # Seiso API v2 URI factory.
8
- #
9
- # URI templating (embodied here) is a temporary strategy for obtaining URIs. The plan is
10
- # to adopt something like a Traverson-style strategy.
11
- #
12
- # Author:: Willie Wheeler (mailto:wwheeler@expedia.com)
13
- # Copyright:: Copyright (c) 2014-2015 Expedia, Inc.
14
- # License:: Apache 2.0
15
- class UriFactoryV2
16
-
17
- def initialize(base_uri)
18
- @base_uri = base_uri
19
- end
20
-
21
- def doc_links_uri(service_key)
22
- uri "/services/#{service_key}/doc-links"
23
- end
24
-
25
- private
26
-
27
- def uri(path)
28
- URI.parse "#{@base_uri}#{path}"
29
- end
30
-
31
- end # class UriFactoryV2
32
- end # module Util
33
- end # class ImportMaster
34
- end # module Seiso