vaguerent/lib/vagrant/plugin/v2/synced_folder.rb

116 lines
3.5 KiB
Ruby

# Copyright (c) HashiCorp, Inc.
# SPDX-License-Identifier: BUSL-1.1
module Vagrant
module Plugin
module V2
# This is the base class for a synced folder implementation.
class SyncedFolder
class Collection < Hash
# @return [Array<Symbol>] names of synced folder types
def types
keys
end
# Fetch the synced plugin folder of the given type
#
# @param [Symbol] t Synced folder type
# @return [Vagrant::Plugin::V2::SyncedFolder]
def type(t)
f = detect { |k, _| k.to_sym == t.to_sym }.last
raise KeyError, "Unknown synced folder type" if !f
f.values.first[:plugin]
end
# Converts to a regular Hash and removes
# plugin instances so the result is ready
# for serialization
#
# @return [Hash]
def to_h
c = lambda do |h|
h.keys.each do |k|
if h[k].is_a?(Hash)
h[k] = c.call(h[k].to_h.clone)
end
end
h
end
h = c.call(super)
h.values.each do |f|
f.values.each do |g|
g.delete(:plugin)
end
end
h
end
end
include CapabilityHost
autoload :Remote, "vagrant/plugin/v2/synced_folder/remote"
# This is called early when the synced folder is set to determine
# if this implementation can be used for this machine. This should
# return true or false.
#
# @param [Machine] machine
# @param [Boolean] raise_error If true, should raise an exception
# if it isn't usable.
# @return [Boolean]
def usable?(machine, raise_error=false)
end
# DEPRECATED: This will be removed.
#
# @deprecated
def prepare(machine, folders, opts)
end
# This is called after the machine is booted and after networks
# are setup.
#
# This might be called with new folders while the machine is running.
# If so, then this should add only those folders without removing
# any existing ones.
#
# No return value.
def enable(machine, folders, opts)
end
# This is called to remove the synced folders from a running
# machine.
#
# This is not guaranteed to be called, but this should be implemented
# by every synced folder implementation.
#
# @param [Machine] machine The machine to modify.
# @param [Hash] folders The folders to remove. This will not contain
# any folders that should remain.
# @param [Hash] opts Any options for the synced folders.
def disable(machine, folders, opts)
end
# This is called after destroying the machine during a
# `vagrant destroy` and also prior to syncing folders during
# a `vagrant up`.
#
# No return value.
#
# @param [Machine] machine
# @param [Hash] opts
def cleanup(machine, opts)
end
def _initialize(machine, synced_folder_type)
plugins = Vagrant.plugin("2").manager.synced_folders
capabilities = Vagrant.plugin("2").manager.synced_folder_capabilities
initialize_capabilities!(synced_folder_type, plugins, capabilities, machine)
self
end
end
end
end
end