From 17fc49cf41b2b415c427c0cfd4e94dce66ffb420 Mon Sep 17 00:00:00 2001 From: Chris Roberts Date: Mon, 20 Jun 2022 13:05:26 -0700 Subject: [PATCH] Add provider parsing to internal endpoint --- .../proto/ruby_vagrant/ruby-server.proto | 6 +++ internal/serverclient/ruby_client.go | 16 ++++++ .../serve/service/internal_service.rb | 53 +++++++++++-------- 3 files changed, 52 insertions(+), 23 deletions(-) diff --git a/internal/server/proto/ruby_vagrant/ruby-server.proto b/internal/server/proto/ruby_vagrant/ruby-server.proto index 482a8f526..0171b3300 100644 --- a/internal/server/proto/ruby_vagrant/ruby-server.proto +++ b/internal/server/proto/ruby_vagrant/ruby-server.proto @@ -17,6 +17,7 @@ service RubyVagrant { rpc ParseVagrantfile(ParseVagrantfileRequest) returns (ParseVagrantfileResponse); rpc ParseVagrantfileProc(ParseVagrantfileProcRequest) returns (ParseVagrantfileResponse); rpc ParseVagrantfileSubvm(ParseVagrantfileSubvmRequest) returns (ParseVagrantfileResponse); + rpc ParseVagrantfileProvider(ParseVagrantfileProviderRequest) returns (ParseVagrantfileResponse); } /******************************************************************** @@ -80,3 +81,8 @@ message ParseVagrantfileResponse { message ParseVagrantfileSubvmRequest { sdk.Config.RawRubyValue subvm = 1; } + +message ParseVagrantfileProviderRequest { + sdk.Config.RawRubyValue subvm = 1; + string provider = 2; +} diff --git a/internal/serverclient/ruby_client.go b/internal/serverclient/ruby_client.go index bfcf6fac2..3ff864607 100644 --- a/internal/serverclient/ruby_client.go +++ b/internal/serverclient/ruby_client.go @@ -105,3 +105,19 @@ func (r *RubyVagrantClient) ParseVagrantfileSubvm(subvm *vagrant_plugin_sdk.Conf return resp.Data, nil } + +func (r *RubyVagrantClient) ParseVagrantfileProvider(provider string, subvm *vagrant_plugin_sdk.Config_RawRubyValue) (*vagrant_plugin_sdk.Args_Hash, error) { + resp, err := r.client.ParseVagrantfileProvider( + context.Background(), + &ruby_vagrant.ParseVagrantfileProviderRequest{ + Provider: provider, + Subvm: subvm, + }, + ) + + if err != nil { + return nil, err + } + + return resp.Data, nil +} diff --git a/plugins/commands/serve/service/internal_service.rb b/plugins/commands/serve/service/internal_service.rb index de70650fa..c8f0fbfd3 100644 --- a/plugins/commands/serve/service/internal_service.rb +++ b/plugins/commands/serve/service/internal_service.rb @@ -41,44 +41,48 @@ module VagrantPlugins end def parse_vagrantfile(req, _) - path = req.path - - # Load up/parse the vagrantfile - config_loader = loader - config_loader.set(:root, path.to_s) - config = config_loader.partial_load(:root) - Hashicorp::Vagrant::ParseVagrantfileResponse.new( - data: config.to_proto, - ) + parse_item_to_proto(req.path.to_s) end def parse_vagrantfile_proc(req, _) callable = mapper.map(req.proc, to: Proc) - config_loader = loader - config_loader.set(:root, [[2, callable]]) - config = config_loader.partial_load(:root) - Hashicorp::Vagrant::ParseVagrantfileResponse.new( - data: config.to_proto, - ) + parse_item_to_proto([["2", callable]]) end def parse_vagrantfile_subvm(req, _) subvm = mapper.map(req.subvm) - config_loader = loader - config_loader.set(:root, subvm.config_procs) - config = config_loader.partial_load(:root) - Hashicorp::Vagrant::ParseVagrantfileResponse.new( - data: config.to_proto, - ) + parse_item_to_proto(subvm.config_procs) end - def loader - Vagrant::Config::Loader.new( + def parse_vagrantfile_provider(req, _) + subvm = mapper.map(req.subvm) + provider = req.provider.to_sym + config = parse_item(subvm.config_procs) + + overrides = config.vm.get_provider_overrides(provider) + + return Hashicorp::Vagrant::ParseVagrantfileResponse.new(data: SDK::Args::Hash.new(entries: [])) if + overrides.empty? + + parse_item_to_proto(config.vm.get_provider_overrides(provider)) + end + + def parse_item(item) + loader = Vagrant::Config::Loader.new( Vagrant::Config::VERSIONS, Vagrant::Config::VERSIONS_ORDER ) + loader.set(:item, item) + loader.partial_load(:item) + end + + def parse_item_to_proto(item) + config = parse_item(item) + Hashicorp::Vagrant::ParseVagrantfileResponse.new( + data: config.to_proto, + ) end def _convert_options_to_proto(type, class_or_tuple_with_class_and_options) @@ -89,6 +93,9 @@ module VagrantPlugins when :COMMUNICATOR # No options for communicators return Google::Protobuf::Empty.new + when :CONFIG + # No options for configs + return Google::Protobuf::Empty.new when :GUEST # No options for guests return Google::Protobuf::Empty.new