Skip to content

Commit ea8cdeb

Browse files
committed
(GH-198) Use Puppetfile-resolver with Puppetfile Validation
Previously the Puppetfile validator only performed basic validation checks. This commit updates the validation to now include doing a full module dependency resolution based on the validation routines in Puppetfile-Resolver. This commit also removes the R10K Puppetfile parsing and uses the parser available in the Puppetfile-Resolver. By default the resolver is enabled, but can be disabled by setting: puppet.validate.resolvePuppetfiles: false
1 parent 2b111c0 commit ea8cdeb

File tree

18 files changed

+272
-342
lines changed

18 files changed

+272
-342
lines changed

lib/puppet-languageserver/language_client.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ class LanguageClient
66

77
# Client settings
88
attr_reader :format_on_type
9+
attr_reader :use_puppetfile_resolver
910

1011
def initialize(message_handler)
1112
@message_handler = message_handler
@@ -23,6 +24,7 @@ def initialize(message_handler)
2324

2425
# Default settings
2526
@format_on_type = false
27+
@use_puppetfile_resolver = true
2628
end
2729

2830
def client_capability(*names)
@@ -55,6 +57,9 @@ def parse_lsp_configuration_settings!(settings = {})
5557
end
5658
@format_on_type = value
5759
end
60+
# use puppetfile resolver
61+
value = safe_hash_traverse(settings, 'puppet', 'validate', 'resolvePuppetfiles')
62+
@use_puppetfile_resolver = to_boolean(value)
5863
end
5964

6065
def capability_registrations(method)

lib/puppet-languageserver/message_handler.rb

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ def notification_textdocument_didopen(client_handler_id, json_rpc_message)
257257
content = json_rpc_message.params['textDocument']['text']
258258
doc_version = json_rpc_message.params['textDocument']['version']
259259
documents.set_document(file_uri, content, doc_version)
260-
PuppetLanguageServer::ValidationQueue.enqueue(file_uri, doc_version, client_handler_id)
260+
enqueue_validation(file_uri, doc_version, client_handler_id)
261261
end
262262

263263
def notification_textdocument_didclose(_, json_rpc_message)
@@ -272,7 +272,7 @@ def notification_textdocument_didchange(client_handler_id, json_rpc_message)
272272
content = json_rpc_message.params['contentChanges'][0]['text'] # TODO: Bad hardcoding zero
273273
doc_version = json_rpc_message.params['textDocument']['version']
274274
documents.set_document(file_uri, content, doc_version)
275-
PuppetLanguageServer::ValidationQueue.enqueue(file_uri, doc_version, client_handler_id)
275+
enqueue_validation(file_uri, doc_version, client_handler_id)
276276
end
277277

278278
def notification_textdocument_didsave(_, _json_rpc_message)
@@ -318,6 +318,18 @@ def unhandled_exception(error, options)
318318
super(error, options)
319319
PuppetLanguageServer::CrashDump.write_crash_file(error, nil, options)
320320
end
321+
322+
private
323+
324+
def enqueue_validation(file_uri, doc_version, client_handler_id)
325+
options = {}
326+
if documents.document_type(file_uri) == :puppetfile
327+
options[:resolve_puppetfile] = language_client.use_puppetfile_resolver
328+
options[:puppet_version] = Puppet.version
329+
options[:module_path] = PuppetLanguageServer::PuppetHelper.module_path
330+
end
331+
PuppetLanguageServer::ValidationQueue.enqueue(file_uri, doc_version, client_handler_id, options)
332+
end
321333
end
322334

323335
class DisabledMessageHandler < PuppetEditorServices::Handler::JsonRPC

lib/puppet-languageserver/providers.rb

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,6 @@
99
manifest/signature_provider
1010
manifest/validation_provider
1111
manifest/hover_provider
12-
puppetfile/r10k/module/base
13-
puppetfile/r10k/module/forge
14-
puppetfile/r10k/module/invalid
15-
puppetfile/r10k/module/local
16-
puppetfile/r10k/module/git
17-
puppetfile/r10k/module/svn
18-
puppetfile/r10k/puppetfile
1912
puppetfile/validation_provider
2013
].each do |lib|
2114
begin

lib/puppet-languageserver/puppet_helper.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,19 @@ def self.initialize_helper(options = {})
2828
sidecar_queue.cache = @inmemory_cache
2929
end
3030

31+
def self.module_path
32+
return @module_path unless @module_path.nil?
33+
# TODO: It would be nice if this wasn't using the whole puppet environment to calculate the modulepath directoties
34+
# In the meantime memoize it. Currently you can't change the modulepath mid-process.
35+
begin
36+
env = Puppet.lookup(:environments).get!(Puppet.settings[:environment])
37+
rescue Puppet::Environments::EnvironmentNotFound, StandardError
38+
env = Puppet.lookup(:current_environment)
39+
end
40+
return [] if env.nil?
41+
@module_path = env.modulepath
42+
end
43+
3144
# Node Graph
3245
def self.get_node_graph(content, local_workspace)
3346
with_temporary_file(content) do |filepath|

lib/puppet-languageserver/puppetfile/r10k/module/base.rb

Lines changed: 0 additions & 65 deletions
This file was deleted.

lib/puppet-languageserver/puppetfile/r10k/module/forge.rb

Lines changed: 0 additions & 44 deletions
This file was deleted.

lib/puppet-languageserver/puppetfile/r10k/module/git.rb

Lines changed: 0 additions & 23 deletions
This file was deleted.

lib/puppet-languageserver/puppetfile/r10k/module/invalid.rb

Lines changed: 0 additions & 29 deletions
This file was deleted.

lib/puppet-languageserver/puppetfile/r10k/module/local.rb

Lines changed: 0 additions & 23 deletions
This file was deleted.

lib/puppet-languageserver/puppetfile/r10k/module/svn.rb

Lines changed: 0 additions & 23 deletions
This file was deleted.

0 commit comments

Comments
 (0)