Provide client and service loader files

The service also includes a service info helper class that
    can wrap requests and extract execution context of request.
    This includes the vagrant service endpoint for connecting
    a client back to the service and the scope of the request.
    It also provides a helper for creating and reusing clients.
This commit is contained in:
Chris Roberts 2021-01-28 17:07:06 -08:00 committed by Paul Hinze
parent ac34b3bcdc
commit afa31bff58
No known key found for this signature in database
GPG Key ID: B69DEDF2D55501C0
2 changed files with 96 additions and 0 deletions

View File

@ -0,0 +1,13 @@
module VagrantPlugins
module CommandServe
module Client
# Simple alias
SDK = Service::SDK
SRV = Service::SRV
ServiceInfo = Service::ServiceInfo
autoload :Machine, Vagrant.source_root.join("plugins/commands/serve/client/machine").to_s
autoload :Terminal, Vagrant.source_root.join("plugins/commands/serve/client/terminal_client").to_s
end
end
end

View File

@ -0,0 +1,83 @@
module VagrantPlugins
module CommandServe
module Service
# Simple aliases
SDK = Hashicorp::Vagrant::Sdk
SRV = Hashicorp::Vagrant
autoload :CommandService, Vagrant.source_root.join("plugins/commands/serve/service/command_service").to_s
autoload :HostService, Vagrant.source_root.join("plugins/commands/serve/service/host_service").to_s
autoload :InternalService, Vagrant.source_root.join("plugins/commands/serve/service/internal_service").to_s
autoload :ProviderService, Vagrant.source_root.join("plugins/commands/serve/service/provider_service").to_s
class ServiceInfo
class ClientInterceptor < GRPC::ClientInterceptor
def request_response(request:, call:, method:, metadata: {})
metadata["client-version"] = "Vagrant/#{Vagrant::VERSION}"
metadata["client-api-protocol"] = "1,1"
yield
end
end
# @return [String, nil] Resource ID for basis of request
attr_reader :basis
# @return [String, nil] Resource ID for project of request
attr_reader :project
# @return [String, nil] Resource ID for machine of request
attr_reader :machine
# @return [String, nil] GRPC endpoint for the Vagrant service
attr_reader :vagrant_service_endpoint
# @return [String] Name of requested plugin
attr_reader :plugin_name
CLIENT_LOCK = Mutex.new
def initialize(basis: nil, project: nil, machine: nil, vagrant_service_endpoint: nil, plugin_name: nil)
@basis = basis
@project = project
@machine = machine
@vagrant_service_endpoint = vagrant_service_endpoint
@plugin_name = plugin_name
end
def self.info
info = Thread.current.thread_variable_get(:service_info)
if info.nil?
raise ArgumentError,
"Service information has not been set!"
end
info
end
def self.client_for(service)
CLIENT_LOCK.synchronize do
@clients ||= {}
return @clients[service] if @clients[service]
@clients[service] = service::Stub.new(
info.vagrant_service_endpoint,
:this_channel_is_insecure,
interceptors: [ClientInterceptor.new]
)
end
end
def self.with_info(context)
info = new(
basis: context.metadata["basis_resource_id"],
project: context.metadata["project_resource_id"],
machine: context.metadata["machine_resource_id"],
vagrant_service_endpoint: context.metadata["vagrant_service_endpoint"],
plugin_name: context.metadata["plugin_name"],
)
Thread.current.thread_variable_set(:service_info, info)
return if !block_given?
begin
yield info
ensure
Thread.current.thread_variable_set(:service_info, nil)
end
end
end
end
end
end