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.
- checksums.yaml +4 -4
- data/.codeclimate.yml +1 -0
- data/.gitignore +6 -0
- data/.travis.yml +3 -3
- data/Gemfile +4 -0
- data/inventory_refresh.gemspec +7 -5
- data/lib/inventory_refresh.rb +1 -0
- data/lib/inventory_refresh/inventory_collection.rb +115 -646
- data/lib/inventory_refresh/inventory_collection/builder.rb +249 -0
- data/lib/inventory_refresh/inventory_collection/graph.rb +0 -15
- data/lib/inventory_refresh/inventory_collection/helpers.rb +6 -0
- data/lib/inventory_refresh/inventory_collection/helpers/associations_helper.rb +80 -0
- data/lib/inventory_refresh/inventory_collection/helpers/initialize_helper.rb +456 -0
- data/lib/inventory_refresh/inventory_collection/helpers/questions_helper.rb +132 -0
- data/lib/inventory_refresh/inventory_collection/index/proxy.rb +1 -1
- data/lib/inventory_refresh/inventory_collection/index/type/skeletal.rb +5 -5
- data/lib/inventory_refresh/inventory_collection/reference.rb +4 -0
- data/lib/inventory_refresh/inventory_collection/scanner.rb +111 -18
- data/lib/inventory_refresh/inventory_collection/serialization.rb +7 -7
- data/lib/inventory_refresh/inventory_collection/unconnected_edge.rb +19 -0
- data/lib/inventory_refresh/inventory_object.rb +17 -11
- data/lib/inventory_refresh/inventory_object_lazy.rb +20 -10
- data/lib/inventory_refresh/persister.rb +212 -0
- data/lib/inventory_refresh/save_collection/base.rb +18 -3
- data/lib/inventory_refresh/save_collection/saver/base.rb +27 -64
- data/lib/inventory_refresh/save_collection/saver/concurrent_safe_batch.rb +73 -225
- data/lib/inventory_refresh/save_collection/saver/partial_upsert_helper.rb +226 -0
- data/lib/inventory_refresh/save_collection/saver/retention_helper.rb +115 -0
- data/lib/inventory_refresh/save_collection/saver/sql_helper.rb +122 -0
- data/lib/inventory_refresh/save_collection/saver/sql_helper_update.rb +24 -5
- data/lib/inventory_refresh/save_collection/saver/sql_helper_upsert.rb +6 -6
- data/lib/inventory_refresh/save_collection/sweeper.rb +69 -0
- data/lib/inventory_refresh/save_inventory.rb +18 -8
- data/lib/inventory_refresh/target_collection.rb +12 -0
- data/lib/inventory_refresh/version.rb +1 -1
- metadata +61 -19
- data/lib/inventory_refresh/save_collection/recursive.rb +0 -52
- 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
|
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.
|
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:
|
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
|
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
|
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
|
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
|
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: '
|
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: '
|
88
|
+
version: '2.0'
|
83
89
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
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.
|
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.
|
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
|
-
|
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
|