seiso-import_master 0.0.10 → 0.0.11

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
- N2RiZjI2ZjkwYTFlN2IwMzk3NWYzMDBlODRjNDA1ZTg5ZDRlMjU5Ng==
4
+ YjkyNzU5ZWYyNWMyNGViYzEzMjdjMDEzZTFiZjQ4N2I2Yzc0OGVlMw==
5
5
  data.tar.gz: !binary |-
6
- ZGRlNDZjN2Q2NjZjZGUzMjdmMDJkYzJlNzU2N2Y3OTQyYjE3Y2Q5MQ==
6
+ ODJlZTgwMWEyY2M2Njc2OThjNTgwY2FhMmU1NWQ0ZDM4NTQ5YzFkZg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- YzNmMWM4MTMxNjA4NTFlYjczYjk3ZGMzZTY0MmQwYzViNGM2ZGJjMDhiZmRj
10
- YmViM2MyOTdlZTYyYjAzZmY1ZjU1ODhiMmRhODY2YzVkZDY5OGIzZTIyNWE2
11
- ZTgyODQ4ZmUxM2I2YTI2YjI4N2Y4N2E5NzJiMTk1NTBmNTUxODk=
9
+ ZGQ4MGU4ZTk0NWMyMGI5M2Y2MzQ5YWU4MzNlM2U2OGUyZjZmODZlNTIxNWE5
10
+ MjQ1OTIyOTEyYjdmYjgxN2M3NWEzODM1MWI0NWMzYWFhZWYzMmQ2ZWZiMWNk
11
+ MDliOGRlYWQxYTg2ODFlZGIyYWNjNjBmNTcwMDExMzc0ZTUyZTk=
12
12
  data.tar.gz: !binary |-
13
- MjgxNzdmNTNkYzY2MjFmOTBlZGQ4NjM4MTU4Y2RlYzEzMzU4Y2IzNWI2NmMx
14
- OTk0YzAwZTBmOGFlY2M5MDBkNTcxZGEzZGMyYTc0MzM3N2E5YWU5NWY0Y2Ey
15
- ZjMxM2MxMjU2MTFiZDlhODIwODI2NWFhOTJhNTFhZDkwOWNkMTE=
13
+ NTBjZDRjMzk1ZDg4MjE5YTgxM2ZkYjU1ZGE1YWUwM2IzYWJmNjU0YTA3NzBm
14
+ ZGE5NjhjZGU3ZjU3M2Y3ZDg2MzIwZTY5MjE5NGE2YmRmMDBmYjVkOWYyYTcx
15
+ NTU2YWRjMGI0OTA1OTc0N2JhZDIyNDMyMWZkOThkMDM4ZGI4YzI=
@@ -9,6 +9,11 @@ module Seiso
9
9
 
10
10
  # Enriches children with a link to the parent, detaches them from the parent, and returns
11
11
  # all detached children.
12
+ #
13
+ # - parents: List of items whose children we will detach.
14
+ # - parent_prop: Name of the parent property on the children.
15
+ # - parent_key: Name that Seiso expects for the parent key.
16
+ # - child_prop: Name of the child property on the items.
12
17
  def detach_children(parents, parent_prop, parent_key, child_prop)
13
18
  all_children = []
14
19
  parents.each do |p|
@@ -1,3 +1,4 @@
1
+ require "uri"
1
2
  require_relative "base_importer"
2
3
 
3
4
  module Seiso
@@ -36,11 +37,13 @@ module Seiso
36
37
  sdm_service_instances = doc['items']
37
38
  sdm_ports = detach_children(sdm_service_instances, 'serviceInstance', 'key', 'ports')
38
39
  sdm_roles = detach_children(sdm_service_instances, 'serviceInstance', 'key', 'ipAddressRoles')
40
+ sdm_dependencies = detach_children(sdm_service_instances, 'serviceInstance', 'key', 'dependencies')
39
41
  sdm_seyren_checks = detach_children(sdm_service_instances, 'serviceInstance', 'key', 'seyrenChecks')
40
42
 
41
43
  import_service_instances sdm_service_instances
42
44
  import_ports sdm_ports
43
45
  import_ip_address_roles sdm_roles
46
+ import_dependencies sdm_dependencies
44
47
  import_seyren_checks sdm_seyren_checks
45
48
  end
46
49
 
@@ -68,6 +71,97 @@ module Seiso
68
71
  @seiso.post_items('ip-address-roles', seiso_roles)
69
72
  end
70
73
 
74
+ def import_dependencies(sdm_dependencies)
75
+ puts "Importing dependencies"
76
+ seiso_dependencies = @service_instance_mapper.seiso_service_instance_dependencies sdm_dependencies
77
+ grouped_seiso_dependencies = group_dependencies_by_service_instance seiso_dependencies
78
+
79
+ # Iterate over the groups, deleting stale dependencies and importing the rest
80
+ grouped_seiso_dependencies.each do |key, group|
81
+ puts "key=#{key}, group=#{group}"
82
+ delete_stale_dependencies(key, group)
83
+
84
+ # Import the dependencies.
85
+ group.each do |d|
86
+ dependent_key = d['dependent']['key']
87
+ dependency_key = d['dependency']['key']
88
+ puts "Importing dependency: dependent=#{dependent_key}, dependency=#{dependency_key}"
89
+ search_uri = @uri_factory_v2.uri "/service-instance-dependencies/search/find-by-keys?dependent=#{dependent_key}&dependency=#{dependency_key}"
90
+
91
+ # TODO 404 means POST, 200 means PUT
92
+ seiso_sid_response = @rest_connector_v2.get search_uri
93
+
94
+ if seiso_sid_response.code == "200"
95
+ # Found it, so PUT
96
+ seiso_sid = JSON.parse seiso_sid_response.body
97
+ dep_uri = URI.parse(seiso_sid['_links']['self']['href'])
98
+ # puts "dep_uri=#{dep_uri}"
99
+ # puts JSON.pretty_generate(d)
100
+ @rest_connector_v2.put(dep_uri, d)
101
+ elsif seiso_sid_response.code == "404"
102
+ # Not found, so POST
103
+ deps_uri = @uri_factory_v2.uri "/service-instance-dependencies"
104
+ @rest_connector_v2.post(deps_uri, d)
105
+ else
106
+ puts "Don't know how to handle response code #{seiso_sid.code}; skipping."
107
+ end
108
+ end
109
+ end
110
+ end
111
+
112
+ # Helper for import_dependencies
113
+ def group_dependencies_by_service_instance(seiso_dependencies)
114
+ grouped_seiso_dependencies = {}
115
+ seiso_dependencies.each do |d|
116
+ dependent_key = d['dependent']['key']
117
+ puts "dependent_key=#{dependent_key}"
118
+ group = grouped_seiso_dependencies[dependent_key]
119
+ if group.nil?
120
+ group = []
121
+ grouped_seiso_dependencies[dependent_key] = group
122
+ end
123
+ group << d
124
+ end
125
+ grouped_seiso_dependencies
126
+ end
127
+
128
+ # Helper for import_dependencies
129
+ #
130
+ # - dependent_key: Key of the dependent service instance.
131
+ # - local_dependencies: List of local dependencies (in Seiso format) associated with
132
+ # the specified dependent.
133
+ def delete_stale_dependencies(dependent_key, local_dependencies)
134
+ puts "Deleting stale dependencies for service instance #{dependent_key}"
135
+
136
+ local_dependency_keys = local_dependencies.map do |local|
137
+ # TODO Will need to update when I update the v2 API
138
+ local['dependency']['key']
139
+ end
140
+
141
+ # FIXME This isn't accounting for pagination!
142
+ # If there are a lot of remote dependencies, some may not be marked as stale.
143
+ # Just need to implement it. [WLW]
144
+ remote_dependencies_uri =
145
+ @uri_factory_v2.uri "/service-instance-dependencies/search/find-by-dependent?key=#{dependent_key}"
146
+ remote_dependencies_response = @rest_connector_v2.get remote_dependencies_uri
147
+ remote_dependencies = JSON.parse(remote_dependencies_response.body)['_embedded']['items']
148
+
149
+ # Identify stale dependencies
150
+ stale_remote_dependencies = remote_dependencies.reject do |remote|
151
+ local_dependency_keys.include? remote['_embedded']['dependency']['key']
152
+ end
153
+
154
+ # Delete stale dependencies from Seiso
155
+ if stale_remote_dependencies.empty?
156
+ puts "No stale dependencies for service instance #{dependent_key}"
157
+ else
158
+ stale_remote_dependencies.each do |stale|
159
+ uri = URI.parse stale['_links']['self']['href']
160
+ @rest_connector_v2.delete uri
161
+ end
162
+ end
163
+ end
164
+
71
165
  def import_seyren_checks(sdm_checks)
72
166
  puts "Importing Seyren checks"
73
167
 
@@ -113,7 +207,6 @@ module Seiso
113
207
  end
114
208
 
115
209
  end
116
-
117
210
  end # class ServiceInstanceImporter
118
211
  end # module Importers
119
212
  end # class ImportMaster
@@ -57,6 +57,19 @@ module Seiso
57
57
  'description' => p['description']
58
58
  }
59
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
60
73
  end
61
74
  end
62
75
  end
@@ -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.10"
7
+ spec.version = "0.0.11"
8
8
  spec.authors = ["Willie Wheeler"]
9
9
  spec.email = ["wwheeler@expedia.com"]
10
10
  spec.summary = "Imports Seiso data master files into Seiso."
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.10
4
+ version: 0.0.11
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-30 00:00:00.000000000 Z
11
+ date: 2015-06-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler