seiso-import_master 0.0.10 → 0.0.11

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
- 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