Skip to content

Commit a8c5e1f

Browse files
committed
(GH-213) Use Facts from the Sidecar
Now that facts can be loaded from the Sidecar, the FacterHelper needs to be updated to use these instead of calling Facter directly. This commit: * Modifies the FacterHelper to call the sidecar queue to get the Fact information * Modifies the FacterHelper to expose methods to query facts * Updates the cache to store facts * Updates the tests for the new Fact collection method
1 parent 2bf5940 commit a8c5e1f

File tree

7 files changed

+48
-52
lines changed

7 files changed

+48
-52
lines changed

lib/puppet-languageserver/facter_helper.rb

Lines changed: 32 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -2,62 +2,49 @@
22

33
module PuppetLanguageServer
44
module FacterHelper
5-
@ops_lock = Mutex.new
65
@facts_loaded = nil
76

8-
def self.reset
9-
@ops_lock.synchronize do
10-
_reset
11-
end
7+
def self.cache
8+
PuppetLanguageServer::PuppetHelper.cache
129
end
1310

14-
def self.load_facts_async
15-
Thread.new do
16-
load_facts
17-
end
11+
def self.sidecar_queue
12+
PuppetLanguageServer::PuppetHelper.sidecar_queue
1813
end
1914

15+
# Facts
2016
def self.facts_loaded?
2117
@facts_loaded.nil? ? false : @facts_loaded
2218
end
2319

24-
def self.load_facts
25-
@ops_lock.synchronize do
26-
_load_facts
27-
end
28-
end
29-
30-
def self.facts
31-
return {} if @facts_loaded == false
32-
@ops_lock.synchronize do
33-
_load_facts if @fact_hash.nil?
34-
@fact_hash.clone
35-
end
36-
end
37-
38-
# DO NOT ops_lock on any of these methods
39-
# deadlocks will ensue!
40-
def self._reset
41-
@facts_loaded = nil
42-
Facter.reset
43-
@fact_hash = nil
44-
end
45-
private_class_method :_reset
46-
47-
def self._load_facts
48-
_reset
49-
@fact_hash = {}
50-
begin
51-
Facter.loadfacts
52-
@fact_hash = Facter.to_hash
53-
rescue StandardError => e
54-
PuppetLanguageServer.log_message(:error, "[FacterHelper::_load_facts] Error loading facts #{e.message} #{e.backtrace}")
55-
rescue LoadError => e
56-
PuppetLanguageServer.log_message(:error, "[FacterHelper::_load_facts] Error loading facts (LoadError) #{e.message} #{e.backtrace}")
57-
end
58-
PuppetLanguageServer.log_message(:debug, "[FacterHelper::_load_facts] Finished loading #{@fact_hash.keys.count} facts")
20+
def self.assert_facts_loaded
5921
@facts_loaded = true
6022
end
61-
private_class_method :_load_facts
23+
24+
def self.load_facts
25+
@facts_loaded = false
26+
sidecar_queue.execute_sync('facts', [])
27+
end
28+
29+
def self.load_facts_async
30+
@facts_loaded = false
31+
sidecar_queue.enqueue('facts', [])
32+
end
33+
34+
def self.fact(name)
35+
return nil if @facts_loaded == false
36+
cache.object_by_name(:fact, name)
37+
end
38+
39+
def self.fact_value(name)
40+
return nil if @facts_loaded == false
41+
object = cache.object_by_name(:fact, name)
42+
object.nil? ? nil : object.value
43+
end
44+
45+
def self.fact_names
46+
return [] if @facts_loaded == false
47+
cache.object_names_by_section(:fact).map(&:to_s)
48+
end
6249
end
6350
end

lib/puppet-languageserver/manifest/completion_provider.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ def self.keywords(keywords = [], &block)
144144
end
145145

146146
def self.all_facts(&block)
147-
PuppetLanguageServer::FacterHelper.facts.each_key do |name|
147+
PuppetLanguageServer::FacterHelper.fact_names.each do |name|
148148
item = LSP::CompletionItem.new(
149149
'label' => name.to_s,
150150
'insertText' => "'#{name}'",
@@ -206,7 +206,7 @@ def self.resolve(completion_item)
206206
data = result.data
207207
case data['type']
208208
when 'variable_expr_fact'
209-
value = PuppetLanguageServer::FacterHelper.facts[data['expr']]
209+
value = PuppetLanguageServer::FacterHelper.fact_value(data['expr'])
210210
# TODO: More things?
211211
result.documentation = value.to_s
212212

lib/puppet-languageserver/manifest/hover_provider.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,9 @@ def self.get_hover_content_for_access_expression(path, expr)
107107

108108
# Content generation functions
109109
def self.get_fact_content(factname)
110-
return nil unless PuppetLanguageServer::FacterHelper.facts.key?(factname)
111-
value = PuppetLanguageServer::FacterHelper.facts[factname]
110+
fact = PuppetLanguageServer::FacterHelper.fact(factname)
111+
return nil if fact.nil?
112+
value = fact.value
112113
content = "**#{factname}** Fact\n\n"
113114

114115
if value.is_a?(Hash)

lib/puppet-languageserver/puppet_helper.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,6 @@ def self.purge_workspace
305305
def self.sidecar_queue
306306
@sidecar_queue_obj ||= PuppetLanguageServer::SidecarQueue.new(@helper_options)
307307
end
308-
private_class_method :sidecar_queue
309308

310309
def self.with_temporary_file(content)
311310
tempfile = Tempfile.new('langserver-sidecar')

lib/puppet-languageserver/puppet_helper/cache.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
module PuppetLanguageServer
44
module PuppetHelper
55
class Cache
6-
SECTIONS = %i[class type function datatype].freeze
6+
SECTIONS = %i[class type function datatype fact].freeze
77
ORIGINS = %i[default workspace bolt].freeze
88

99
def initialize(_options = {})

lib/puppet-languageserver/sidecar_queue.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,13 @@ def execute_sync(action, additional_args, handle_errors = false)
111111

112112
PuppetLanguageServer::PuppetHelper.assert_default_types_loaded
113113

114+
when 'facts'
115+
list = PuppetLanguageServer::Sidecar::Protocol::FactList.new.from_json!(result)
116+
@cache.import_sidecar_list!(list, :fact, :default)
117+
PuppetLanguageServer.log_message(:debug, "SidecarQueue Thread: facts returned #{list.count} items")
118+
119+
PuppetLanguageServer::FacterHelper.assert_facts_loaded
120+
114121
when 'node_graph'
115122
return PuppetLanguageServer::Sidecar::Protocol::NodeGraph.new.from_json!(result)
116123

spec/languageserver/spec_helper.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,14 @@ def wait_for_puppet_loading
2424
break if PuppetLanguageServer::PuppetHelper.default_functions_loaded? &&
2525
PuppetLanguageServer::PuppetHelper.default_types_loaded? &&
2626
PuppetLanguageServer::PuppetHelper.default_classes_loaded? &&
27-
PuppetLanguageServer::PuppetHelper.default_datatypes_loaded?
27+
PuppetLanguageServer::PuppetHelper.default_datatypes_loaded? &&
28+
PuppetLanguageServer::FacterHelper.facts_loaded?
2829
sleep(1)
2930
interation += 1
3031
next if interation < 90
3132
raise <<-ERRORMSG
3233
Puppet has not be initialised in time:
34+
facts_loaded? = #{PuppetLanguageServer::FacterHelper.facts_loaded?}
3335
functions_loaded? = #{PuppetLanguageServer::PuppetHelper.default_functions_loaded?}
3436
types_loaded? = #{PuppetLanguageServer::PuppetHelper.default_types_loaded?}
3537
classes_loaded? = #{PuppetLanguageServer::PuppetHelper.default_classes_loaded?}

0 commit comments

Comments
 (0)