seiso-import_master 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
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