inventory_refresh 0.1.1 → 0.2.2

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 (38) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +1 -0
  3. data/.gitignore +6 -0
  4. data/.travis.yml +3 -3
  5. data/Gemfile +4 -0
  6. data/inventory_refresh.gemspec +7 -5
  7. data/lib/inventory_refresh.rb +1 -0
  8. data/lib/inventory_refresh/inventory_collection.rb +115 -646
  9. data/lib/inventory_refresh/inventory_collection/builder.rb +249 -0
  10. data/lib/inventory_refresh/inventory_collection/graph.rb +0 -15
  11. data/lib/inventory_refresh/inventory_collection/helpers.rb +6 -0
  12. data/lib/inventory_refresh/inventory_collection/helpers/associations_helper.rb +80 -0
  13. data/lib/inventory_refresh/inventory_collection/helpers/initialize_helper.rb +456 -0
  14. data/lib/inventory_refresh/inventory_collection/helpers/questions_helper.rb +132 -0
  15. data/lib/inventory_refresh/inventory_collection/index/proxy.rb +1 -1
  16. data/lib/inventory_refresh/inventory_collection/index/type/skeletal.rb +5 -5
  17. data/lib/inventory_refresh/inventory_collection/reference.rb +4 -0
  18. data/lib/inventory_refresh/inventory_collection/scanner.rb +111 -18
  19. data/lib/inventory_refresh/inventory_collection/serialization.rb +7 -7
  20. data/lib/inventory_refresh/inventory_collection/unconnected_edge.rb +19 -0
  21. data/lib/inventory_refresh/inventory_object.rb +17 -11
  22. data/lib/inventory_refresh/inventory_object_lazy.rb +20 -10
  23. data/lib/inventory_refresh/persister.rb +212 -0
  24. data/lib/inventory_refresh/save_collection/base.rb +18 -3
  25. data/lib/inventory_refresh/save_collection/saver/base.rb +27 -64
  26. data/lib/inventory_refresh/save_collection/saver/concurrent_safe_batch.rb +73 -225
  27. data/lib/inventory_refresh/save_collection/saver/partial_upsert_helper.rb +226 -0
  28. data/lib/inventory_refresh/save_collection/saver/retention_helper.rb +115 -0
  29. data/lib/inventory_refresh/save_collection/saver/sql_helper.rb +122 -0
  30. data/lib/inventory_refresh/save_collection/saver/sql_helper_update.rb +24 -5
  31. data/lib/inventory_refresh/save_collection/saver/sql_helper_upsert.rb +6 -6
  32. data/lib/inventory_refresh/save_collection/sweeper.rb +69 -0
  33. data/lib/inventory_refresh/save_inventory.rb +18 -8
  34. data/lib/inventory_refresh/target_collection.rb +12 -0
  35. data/lib/inventory_refresh/version.rb +1 -1
  36. metadata +61 -19
  37. data/lib/inventory_refresh/save_collection/recursive.rb +0 -52
  38. data/lib/inventory_refresh/save_collection/saver/concurrent_safe.rb +0 -71
@@ -76,5 +76,17 @@ module InventoryRefresh
76
76
  def manager_refs_by_association_reset
77
77
  @manager_refs_by_association = nil
78
78
  end
79
+
80
+ # Returns list of ems_refs
81
+ # @return [Array<String>]
82
+ def references(collection)
83
+ manager_refs_by_association.try(:[], collection).try(:[], :ems_ref)&.to_a || []
84
+ end
85
+
86
+ # Returns list of names
87
+ # @return [Array<String>]
88
+ def name_references(collection)
89
+ manager_refs_by_association.try(:[], collection).try(:[], :name)&.to_a || []
90
+ end
79
91
  end
80
92
  end
@@ -1,3 +1,3 @@
1
1
  module InventoryRefresh
2
- VERSION = "0.1.1".freeze
2
+ VERSION = "0.2.2".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: inventory_refresh
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - ManageIQ Developers
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-09-13 00:00:00.000000000 Z
11
+ date: 2020-07-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -16,42 +16,48 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 5.0.6
19
+ version: '5.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 5.0.6
26
+ version: '5.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: more_core_extensions
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '3.5'
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: '5'
34
37
  type: :runtime
35
38
  prerelease: false
36
39
  version_requirements: !ruby/object:Gem::Requirement
37
40
  requirements:
38
- - - "~>"
41
+ - - ">="
39
42
  - !ruby/object:Gem::Version
40
43
  version: '3.5'
44
+ - - "<"
45
+ - !ruby/object:Gem::Version
46
+ version: '5'
41
47
  - !ruby/object:Gem::Dependency
42
48
  name: pg
43
49
  requirement: !ruby/object:Gem::Requirement
44
50
  requirements:
45
- - - "~>"
51
+ - - ">"
46
52
  - !ruby/object:Gem::Version
47
- version: 0.18.2
53
+ version: '0'
48
54
  type: :runtime
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
51
57
  requirements:
52
- - - "~>"
58
+ - - ">"
53
59
  - !ruby/object:Gem::Version
54
- version: 0.18.2
60
+ version: '0'
55
61
  - !ruby/object:Gem::Dependency
56
62
  name: ancestry
57
63
  requirement: !ruby/object:Gem::Requirement
@@ -72,28 +78,28 @@ dependencies:
72
78
  requirements:
73
79
  - - "~>"
74
80
  - !ruby/object:Gem::Version
75
- version: '1.16'
81
+ version: '2.0'
76
82
  type: :development
77
83
  prerelease: false
78
84
  version_requirements: !ruby/object:Gem::Requirement
79
85
  requirements:
80
86
  - - "~>"
81
87
  - !ruby/object:Gem::Version
82
- version: '1.16'
88
+ version: '2.0'
83
89
  - !ruby/object:Gem::Dependency
84
- name: factory_girl
90
+ name: factory_bot
85
91
  requirement: !ruby/object:Gem::Requirement
86
92
  requirements:
87
93
  - - "~>"
88
94
  - !ruby/object:Gem::Version
89
- version: 4.5.0
95
+ version: 4.11.1
90
96
  type: :development
91
97
  prerelease: false
92
98
  version_requirements: !ruby/object:Gem::Requirement
93
99
  requirements:
94
100
  - - "~>"
95
101
  - !ruby/object:Gem::Version
96
- version: 4.5.0
102
+ version: 4.11.1
97
103
  - !ruby/object:Gem::Dependency
98
104
  name: rake
99
105
  requirement: !ruby/object:Gem::Requirement
@@ -122,6 +128,34 @@ dependencies:
122
128
  - - "~>"
123
129
  - !ruby/object:Gem::Version
124
130
  version: '3.0'
131
+ - !ruby/object:Gem::Dependency
132
+ name: rubocop
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ - !ruby/object:Gem::Dependency
146
+ name: rubocop-performance
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
125
159
  - !ruby/object:Gem::Dependency
126
160
  name: simplecov
127
161
  requirement: !ruby/object:Gem::Requirement
@@ -158,6 +192,7 @@ files:
158
192
  - Rakefile
159
193
  - bin/console
160
194
  - bin/setup
195
+ - bundler.d/.gitkeep
161
196
  - config/database.yml
162
197
  - inventory_refresh.gemspec
163
198
  - lib/inventory_refresh.rb
@@ -166,8 +201,13 @@ files:
166
201
  - lib/inventory_refresh/graph.rb
167
202
  - lib/inventory_refresh/graph/topological_sort.rb
168
203
  - lib/inventory_refresh/inventory_collection.rb
204
+ - lib/inventory_refresh/inventory_collection/builder.rb
169
205
  - lib/inventory_refresh/inventory_collection/data_storage.rb
170
206
  - lib/inventory_refresh/inventory_collection/graph.rb
207
+ - lib/inventory_refresh/inventory_collection/helpers.rb
208
+ - lib/inventory_refresh/inventory_collection/helpers/associations_helper.rb
209
+ - lib/inventory_refresh/inventory_collection/helpers/initialize_helper.rb
210
+ - lib/inventory_refresh/inventory_collection/helpers/questions_helper.rb
171
211
  - lib/inventory_refresh/inventory_collection/index/proxy.rb
172
212
  - lib/inventory_refresh/inventory_collection/index/type/base.rb
173
213
  - lib/inventory_refresh/inventory_collection/index/type/data.rb
@@ -177,20 +217,23 @@ files:
177
217
  - lib/inventory_refresh/inventory_collection/references_storage.rb
178
218
  - lib/inventory_refresh/inventory_collection/scanner.rb
179
219
  - lib/inventory_refresh/inventory_collection/serialization.rb
220
+ - lib/inventory_refresh/inventory_collection/unconnected_edge.rb
180
221
  - lib/inventory_refresh/inventory_object.rb
181
222
  - lib/inventory_refresh/inventory_object_lazy.rb
182
223
  - lib/inventory_refresh/logging.rb
183
224
  - lib/inventory_refresh/null_logger.rb
225
+ - lib/inventory_refresh/persister.rb
184
226
  - lib/inventory_refresh/save_collection/base.rb
185
- - lib/inventory_refresh/save_collection/recursive.rb
186
227
  - lib/inventory_refresh/save_collection/saver/base.rb
187
228
  - lib/inventory_refresh/save_collection/saver/batch.rb
188
- - lib/inventory_refresh/save_collection/saver/concurrent_safe.rb
189
229
  - lib/inventory_refresh/save_collection/saver/concurrent_safe_batch.rb
190
230
  - lib/inventory_refresh/save_collection/saver/default.rb
231
+ - lib/inventory_refresh/save_collection/saver/partial_upsert_helper.rb
232
+ - lib/inventory_refresh/save_collection/saver/retention_helper.rb
191
233
  - lib/inventory_refresh/save_collection/saver/sql_helper.rb
192
234
  - lib/inventory_refresh/save_collection/saver/sql_helper_update.rb
193
235
  - lib/inventory_refresh/save_collection/saver/sql_helper_upsert.rb
236
+ - lib/inventory_refresh/save_collection/sweeper.rb
194
237
  - lib/inventory_refresh/save_collection/topological_sort.rb
195
238
  - lib/inventory_refresh/save_inventory.rb
196
239
  - lib/inventory_refresh/target.rb
@@ -215,8 +258,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
215
258
  - !ruby/object:Gem::Version
216
259
  version: '0'
217
260
  requirements: []
218
- rubyforge_project:
219
- rubygems_version: 2.7.6
261
+ rubygems_version: 3.1.3
220
262
  signing_key:
221
263
  specification_version: 4
222
264
  summary: Topological Inventory Persister
@@ -1,52 +0,0 @@
1
- require "inventory_refresh/save_collection/base"
2
-
3
- module InventoryRefresh::SaveCollection
4
- class Recursive < InventoryRefresh::SaveCollection::Base
5
- class << self
6
- # Saves the passed InventoryCollection objects by recursively passing the graph
7
- #
8
- # @param ems [ExtManagementSystem] manager owning the inventory_collections
9
- # @param inventory_collections [Array<InventoryRefresh::InventoryCollection>] array of InventoryCollection objects
10
- # for saving
11
- def save_collections(ems, inventory_collections)
12
- graph = InventoryRefresh::InventoryCollection::Graph.new(inventory_collections)
13
- graph.build_directed_acyclic_graph!
14
-
15
- graph.nodes.each do |inventory_collection|
16
- save_collection(ems, inventory_collection, [])
17
- end
18
- end
19
-
20
- private
21
-
22
- # Saves the one passed InventoryCollection object
23
- #
24
- # @param ems [ExtManagementSystem] manager owning the inventory_collections
25
- # @param inventory_collection [InventoryRefresh::InventoryCollection] InventoryCollection object for saving
26
- # @param traversed_collections [Array<InventoryRefresh::InventoryCollection>] array of traversed InventoryCollection
27
- # objects, that we use for detecting possible cycle
28
- def save_collection(ems, inventory_collection, traversed_collections)
29
- unless inventory_collection.kind_of?(::InventoryRefresh::InventoryCollection)
30
- raise "A InventoryRefresh::SaveInventory needs a InventoryCollection object, it got: #{inventory_collection.inspect}"
31
- end
32
-
33
- return if inventory_collection.saved?
34
-
35
- traversed_collections << inventory_collection
36
-
37
- unless inventory_collection.saveable?
38
- inventory_collection.dependencies.each do |dependency|
39
- next if dependency.saved?
40
- if traversed_collections.include?(dependency)
41
- raise "Edge from #{inventory_collection} to #{dependency} creates a cycle"
42
- end
43
- save_collection(ems, dependency, traversed_collections)
44
- end
45
- end
46
-
47
- logger.debug("Saving #{inventory_collection} of size #{inventory_collection.size}")
48
- save_inventory_object_inventory(ems, inventory_collection)
49
- end
50
- end
51
- end
52
- end
@@ -1,71 +0,0 @@
1
- require "inventory_refresh/save_collection/saver/base"
2
-
3
- module InventoryRefresh::SaveCollection
4
- module Saver
5
- class ConcurrentSafe < InventoryRefresh::SaveCollection::Saver::Base
6
- # TODO(lsmola) this strategy does not make much sense, it's better to use concurent_safe_batch and make batch size
7
- # configurable
8
- private
9
-
10
- # Updates the passed record with hash data and stores primary key value into inventory_object.
11
- #
12
- # @param record [ApplicationRecord] record we want to update in DB
13
- # @param hash [Hash] data we want to update the record with
14
- # @param inventory_object [InventoryRefresh::InventoryObject] InventoryObject instance where we will store primary
15
- # key value
16
- def update_record!(record, hash, inventory_object)
17
- assign_attributes_for_update!(hash, time_now)
18
- record.assign_attributes(hash.except(:id))
19
-
20
- if !inventory_object.inventory_collection.check_changed? || record.changed?
21
- update_query = inventory_object.inventory_collection.model_class.where(:id => record.id)
22
- if hash[:remote_data_timestamp]
23
- timestamp_field = inventory_collection.model_class.arel_table[:remote_data_timestamp]
24
- update_query = update_query.where(timestamp_field.lt(hash[:remote_data_timestamp]))
25
- end
26
-
27
- update_query.update_all(hash)
28
- inventory_collection.store_updated_records(record)
29
- end
30
-
31
- inventory_object.id = record.id
32
- end
33
-
34
- # Creates a new record in the DB using the passed hash data
35
- #
36
- # @param hash [Hash] hash with data we want to persist to DB
37
- # @param inventory_object [InventoryRefresh::InventoryObject] InventoryObject instance where we will store primary
38
- # key value
39
- def create_record!(hash, inventory_object)
40
- all_attribute_keys = hash.keys
41
- data = inventory_collection.model_class.new(hash).attributes.symbolize_keys
42
-
43
- # TODO(lsmola) abstract common behavior into base class
44
- all_attribute_keys << :type if supports_sti?
45
- all_attribute_keys << :created_at if supports_created_at?
46
- all_attribute_keys << :updated_at if supports_updated_at?
47
- all_attribute_keys << :created_on if supports_created_on?
48
- all_attribute_keys << :updated_on if supports_updated_on?
49
- hash_for_creation = if inventory_collection.use_ar_object?
50
- record = inventory_collection.model_class.new(data)
51
- values_for_database!(all_attribute_keys,
52
- record.attributes.symbolize_keys)
53
- elsif serializable_keys?
54
- values_for_database!(all_attribute_keys,
55
- data)
56
- else
57
- data
58
- end
59
-
60
- assign_attributes_for_create!(hash_for_creation, time_now)
61
-
62
- result_id = ActiveRecord::Base.connection.execute(
63
- build_insert_query(all_attribute_keys, [hash_for_creation])
64
- )
65
-
66
- inventory_object.id = result_id.to_a.try(:first).try(:[], "id")
67
- inventory_collection.store_created_records(inventory_object)
68
- end
69
- end
70
- end
71
- end