From 7477455380ea4c89826976bcd3fdc3633cb66dab Mon Sep 17 00:00:00 2001 From: sophia Date: Fri, 27 Aug 2021 10:33:45 -0500 Subject: [PATCH] Get parents from guest plugin --- lib/vagrant/guest/remote.rb | 1 + lib/vagrant/plugin/v2/guest.rb | 19 +++++++++++++++++++ .../commands/serve/service/guest_service.rb | 17 +++-------------- .../serve/service/guest_service_test.rb | 10 ++++++++-- 4 files changed, 31 insertions(+), 16 deletions(-) diff --git a/lib/vagrant/guest/remote.rb b/lib/vagrant/guest/remote.rb index f6886b986..dbe2a9ed9 100644 --- a/lib/vagrant/guest/remote.rb +++ b/lib/vagrant/guest/remote.rb @@ -60,6 +60,7 @@ module Vagrant # # @return [Symbol] def name + # TODO: this can probably be deleted client.parents[0] end diff --git a/lib/vagrant/plugin/v2/guest.rb b/lib/vagrant/plugin/v2/guest.rb index 5f6b36fba..6e931c261 100644 --- a/lib/vagrant/plugin/v2/guest.rb +++ b/lib/vagrant/plugin/v2/guest.rb @@ -17,6 +17,25 @@ module Vagrant def detect?(machine) false end + + # Returns list of parents for + # this guest + # + # @return [Array] + def parents + guests = Vagrant.plugin("2").manager.guests.to_hash + ancestors = [] + n, entry = guests.detect { |_, v| v.first == self.class } + while n + n = nil + if entry.last + ancestors << entry.last + entry = guests[entry.last] + n = entry.last + end + end + ancestors + end end end end diff --git a/plugins/commands/serve/service/guest_service.rb b/plugins/commands/serve/service/guest_service.rb index 21a26f23e..2cb79306b 100644 --- a/plugins/commands/serve/service/guest_service.rb +++ b/plugins/commands/serve/service/guest_service.rb @@ -64,26 +64,15 @@ module VagrantPlugins ) end - def get_parent_chain(plugin_name) - chain = [plugin_name] - plugins = Vagrant.plugin("2").manager.guests[plugin_name.to_s.to_sym].to_a - if plugins.last.nil? - return chain - else - chain + get_parent_chain(plugins.last) - end - end - def parents(req, ctx) ServiceInfo.with_info(ctx) do |info| plugin_name = info.plugin_name - plugin = Vagrant.plugin("2").manager.guests[plugin_name.to_s.to_sym].to_a - if !plugin.first + plugin = Vagrant.plugin("2").manager.guests[plugin_name.to_s.to_sym].to_a.first + if !plugin raise "Failed to locate guest plugin for: #{plugin_name.inspect}" end - guest_chain = get_parent_chain(plugin_name.to_s.to_sym) SDK::Platform::ParentsResp.new( - parents: guest_chain + parents: plugin.new.parents ) end end diff --git a/test/unit/plugins/commands/serve/service/guest_service_test.rb b/test/unit/plugins/commands/serve/service/guest_service_test.rb index 10f7285bb..413bf7545 100644 --- a/test/unit/plugins/commands/serve/service/guest_service_test.rb +++ b/test/unit/plugins/commands/serve/service/guest_service_test.rb @@ -1,6 +1,7 @@ require File.expand_path("../../../../../base", __FILE__) require Vagrant.source_root.join("plugins/commands/serve/command") +require Vagrant.source_root.join("plugins/commands/serve/broker").to_s class DummyContext attr_reader :metadata @@ -34,6 +35,12 @@ describe VagrantPlugins::CommandServe::Service::GuestService do subject { described_class.new(broker: broker) } before(:each) do + parent_test_guest = Class.new(Vagrant.plugin("2", :guest)) do + def detect?(machine) + true + end + end + test_guest = Class.new(Vagrant.plugin("2", :guest)) do def detect?(machine) true @@ -41,6 +48,7 @@ describe VagrantPlugins::CommandServe::Service::GuestService do end register_plugin do |p| + p.guest(:parent_test) { parent_test_guest } p.guest(:test, :parent_test) { test_guest } end end @@ -60,9 +68,7 @@ describe VagrantPlugins::CommandServe::Service::GuestService do ctx = DummyContext.new("test") parents = subject.parents("", ctx) expect(parents).not_to be_nil - expect(parents.parents).to include("test") expect(parents.parents).to include("parent_test") - end end