inventory_refresh 0.1.2 → 0.2.3
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 +114 -649
- 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/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 +25 -62
- 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 +73 -25
- 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,57 +1,69 @@
|
|
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.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ManageIQ Developers
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-12-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '5.0'
|
20
|
+
- - "<"
|
18
21
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
22
|
+
version: '6.1'
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
|
-
- - "
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '5.0'
|
30
|
+
- - "<"
|
25
31
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
32
|
+
version: '6.1'
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: more_core_extensions
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
31
|
-
- - "
|
37
|
+
- - ">="
|
32
38
|
- !ruby/object:Gem::Version
|
33
39
|
version: '3.5'
|
40
|
+
- - "<"
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '5'
|
34
43
|
type: :runtime
|
35
44
|
prerelease: false
|
36
45
|
version_requirements: !ruby/object:Gem::Requirement
|
37
46
|
requirements:
|
38
|
-
- - "
|
47
|
+
- - ">="
|
39
48
|
- !ruby/object:Gem::Version
|
40
49
|
version: '3.5'
|
50
|
+
- - "<"
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '5'
|
41
53
|
- !ruby/object:Gem::Dependency
|
42
54
|
name: pg
|
43
55
|
requirement: !ruby/object:Gem::Requirement
|
44
56
|
requirements:
|
45
|
-
- - "
|
57
|
+
- - ">"
|
46
58
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0
|
59
|
+
version: '0'
|
48
60
|
type: :runtime
|
49
61
|
prerelease: false
|
50
62
|
version_requirements: !ruby/object:Gem::Requirement
|
51
63
|
requirements:
|
52
|
-
- - "
|
64
|
+
- - ">"
|
53
65
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0
|
66
|
+
version: '0'
|
55
67
|
- !ruby/object:Gem::Dependency
|
56
68
|
name: ancestry
|
57
69
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,28 +84,28 @@ dependencies:
|
|
72
84
|
requirements:
|
73
85
|
- - "~>"
|
74
86
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
87
|
+
version: '2.0'
|
76
88
|
type: :development
|
77
89
|
prerelease: false
|
78
90
|
version_requirements: !ruby/object:Gem::Requirement
|
79
91
|
requirements:
|
80
92
|
- - "~>"
|
81
93
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
94
|
+
version: '2.0'
|
83
95
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
96
|
+
name: factory_bot
|
85
97
|
requirement: !ruby/object:Gem::Requirement
|
86
98
|
requirements:
|
87
99
|
- - "~>"
|
88
100
|
- !ruby/object:Gem::Version
|
89
|
-
version: 4.
|
101
|
+
version: 4.11.1
|
90
102
|
type: :development
|
91
103
|
prerelease: false
|
92
104
|
version_requirements: !ruby/object:Gem::Requirement
|
93
105
|
requirements:
|
94
106
|
- - "~>"
|
95
107
|
- !ruby/object:Gem::Version
|
96
|
-
version: 4.
|
108
|
+
version: 4.11.1
|
97
109
|
- !ruby/object:Gem::Dependency
|
98
110
|
name: rake
|
99
111
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,6 +134,34 @@ dependencies:
|
|
122
134
|
- - "~>"
|
123
135
|
- !ruby/object:Gem::Version
|
124
136
|
version: '3.0'
|
137
|
+
- !ruby/object:Gem::Dependency
|
138
|
+
name: rubocop
|
139
|
+
requirement: !ruby/object:Gem::Requirement
|
140
|
+
requirements:
|
141
|
+
- - ">="
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: '0'
|
144
|
+
type: :development
|
145
|
+
prerelease: false
|
146
|
+
version_requirements: !ruby/object:Gem::Requirement
|
147
|
+
requirements:
|
148
|
+
- - ">="
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
version: '0'
|
151
|
+
- !ruby/object:Gem::Dependency
|
152
|
+
name: rubocop-performance
|
153
|
+
requirement: !ruby/object:Gem::Requirement
|
154
|
+
requirements:
|
155
|
+
- - ">="
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0'
|
158
|
+
type: :development
|
159
|
+
prerelease: false
|
160
|
+
version_requirements: !ruby/object:Gem::Requirement
|
161
|
+
requirements:
|
162
|
+
- - ">="
|
163
|
+
- !ruby/object:Gem::Version
|
164
|
+
version: '0'
|
125
165
|
- !ruby/object:Gem::Dependency
|
126
166
|
name: simplecov
|
127
167
|
requirement: !ruby/object:Gem::Requirement
|
@@ -137,7 +177,7 @@ dependencies:
|
|
137
177
|
- !ruby/object:Gem::Version
|
138
178
|
version: '0'
|
139
179
|
description: Topological Inventory Persister
|
140
|
-
email:
|
180
|
+
email:
|
141
181
|
executables: []
|
142
182
|
extensions: []
|
143
183
|
extra_rdoc_files: []
|
@@ -158,6 +198,7 @@ files:
|
|
158
198
|
- Rakefile
|
159
199
|
- bin/console
|
160
200
|
- bin/setup
|
201
|
+
- bundler.d/.gitkeep
|
161
202
|
- config/database.yml
|
162
203
|
- inventory_refresh.gemspec
|
163
204
|
- lib/inventory_refresh.rb
|
@@ -166,8 +207,13 @@ files:
|
|
166
207
|
- lib/inventory_refresh/graph.rb
|
167
208
|
- lib/inventory_refresh/graph/topological_sort.rb
|
168
209
|
- lib/inventory_refresh/inventory_collection.rb
|
210
|
+
- lib/inventory_refresh/inventory_collection/builder.rb
|
169
211
|
- lib/inventory_refresh/inventory_collection/data_storage.rb
|
170
212
|
- lib/inventory_refresh/inventory_collection/graph.rb
|
213
|
+
- lib/inventory_refresh/inventory_collection/helpers.rb
|
214
|
+
- lib/inventory_refresh/inventory_collection/helpers/associations_helper.rb
|
215
|
+
- lib/inventory_refresh/inventory_collection/helpers/initialize_helper.rb
|
216
|
+
- lib/inventory_refresh/inventory_collection/helpers/questions_helper.rb
|
171
217
|
- lib/inventory_refresh/inventory_collection/index/proxy.rb
|
172
218
|
- lib/inventory_refresh/inventory_collection/index/type/base.rb
|
173
219
|
- lib/inventory_refresh/inventory_collection/index/type/data.rb
|
@@ -177,20 +223,23 @@ files:
|
|
177
223
|
- lib/inventory_refresh/inventory_collection/references_storage.rb
|
178
224
|
- lib/inventory_refresh/inventory_collection/scanner.rb
|
179
225
|
- lib/inventory_refresh/inventory_collection/serialization.rb
|
226
|
+
- lib/inventory_refresh/inventory_collection/unconnected_edge.rb
|
180
227
|
- lib/inventory_refresh/inventory_object.rb
|
181
228
|
- lib/inventory_refresh/inventory_object_lazy.rb
|
182
229
|
- lib/inventory_refresh/logging.rb
|
183
230
|
- lib/inventory_refresh/null_logger.rb
|
231
|
+
- lib/inventory_refresh/persister.rb
|
184
232
|
- lib/inventory_refresh/save_collection/base.rb
|
185
|
-
- lib/inventory_refresh/save_collection/recursive.rb
|
186
233
|
- lib/inventory_refresh/save_collection/saver/base.rb
|
187
234
|
- lib/inventory_refresh/save_collection/saver/batch.rb
|
188
|
-
- lib/inventory_refresh/save_collection/saver/concurrent_safe.rb
|
189
235
|
- lib/inventory_refresh/save_collection/saver/concurrent_safe_batch.rb
|
190
236
|
- lib/inventory_refresh/save_collection/saver/default.rb
|
237
|
+
- lib/inventory_refresh/save_collection/saver/partial_upsert_helper.rb
|
238
|
+
- lib/inventory_refresh/save_collection/saver/retention_helper.rb
|
191
239
|
- lib/inventory_refresh/save_collection/saver/sql_helper.rb
|
192
240
|
- lib/inventory_refresh/save_collection/saver/sql_helper_update.rb
|
193
241
|
- lib/inventory_refresh/save_collection/saver/sql_helper_upsert.rb
|
242
|
+
- lib/inventory_refresh/save_collection/sweeper.rb
|
194
243
|
- lib/inventory_refresh/save_collection/topological_sort.rb
|
195
244
|
- lib/inventory_refresh/save_inventory.rb
|
196
245
|
- lib/inventory_refresh/target.rb
|
@@ -200,7 +249,7 @@ homepage: https://github.com/ManageIQ/inventory_refresh
|
|
200
249
|
licenses:
|
201
250
|
- Apache-2.0
|
202
251
|
metadata: {}
|
203
|
-
post_install_message:
|
252
|
+
post_install_message:
|
204
253
|
rdoc_options: []
|
205
254
|
require_paths:
|
206
255
|
- lib
|
@@ -215,9 +264,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
215
264
|
- !ruby/object:Gem::Version
|
216
265
|
version: '0'
|
217
266
|
requirements: []
|
218
|
-
|
219
|
-
|
220
|
-
signing_key:
|
267
|
+
rubygems_version: 3.2.0.rc.2
|
268
|
+
signing_key:
|
221
269
|
specification_version: 4
|
222
270
|
summary: Topological Inventory Persister
|
223
271
|
test_files: []
|
@@ -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
|