vagrant/plugins/kernel_v2/config/trigger.rb

163 lines
5.4 KiB
Ruby
Raw Normal View History

2018-03-08 22:20:21 +00:00
require "vagrant"
require File.expand_path("../vm_trigger", __FILE__)
2018-03-08 22:20:21 +00:00
module VagrantPlugins
module Kernel_V2
class TriggerConfig < Vagrant.plugin("2", :config)
2018-03-08 23:34:39 +00:00
2018-03-08 22:20:21 +00:00
def initialize
@logger = Log4r::Logger.new("vagrant::config::trigger")
# Internal State
2018-03-13 18:33:48 +00:00
@_before_triggers = [] # An array of VagrantConfigTrigger objects
@_after_triggers = [] # An array of VagrantConfigTrigger objects
2018-03-08 22:20:21 +00:00
end
#-------------------------------------------------------------------
# Trigger before/after functions
#-------------------------------------------------------------------
#
# Commands are expected to be ether:
# - splat
# + config.trigger.before :up, :destroy, :halt do |trigger|....
# - array
# + config.trigger.before [:up, :destroy, :halt] do |trigger|....
#
# Config is expected to be given as a block, or the last parameter as a hash
#
# - block
# + config.trigger.before :up, :destroy, :halt do |trigger|
# trigger.option = "option"
# end
# - hash
# + config.trigger.before :up, :destroy, :halt, options: "option"
2018-03-10 00:45:48 +00:00
# Reads in and parses Vagrant command whitelist and settings for a defined
# trigger
#
# @param [Symbol] command Vagrant command to create trigger on
2018-03-10 00:45:48 +00:00
# @param [Block] block The defined before block
def before(*command, &block)
command.flatten!
blk = block
if !block_given? && command.last.is_a?(Hash)
# We were given a hash rather than a block,
# so the last element should be the "config block"
# and the rest are commands for the trigger
blk = command.pop
2018-03-10 00:45:48 +00:00
else
# No config block given at all, validation step should throw error?
end
command.each do |cmd|
2018-03-13 18:07:41 +00:00
trigger = create_trigger(cmd, blk)
@_before_triggers << trigger
end
2018-03-08 22:20:21 +00:00
end
# Reads in and parses Vagrant command whitelist and settings for a defined
# trigger
#
# @param [Symbol] command Vagrant command to create trigger on
2018-03-13 18:07:41 +00:00
# @param [Block] block The defined after block
def after(*command, &block)
command.flatten!
blk = block
if !block_given? && command.last.is_a?(Hash)
# We were given a hash rather than a block,
# so the last element should be the "config block"
# and the rest are commands for the trigger
blk = command.pop
2018-03-10 00:45:48 +00:00
else
# No config block given at all, validation step should throw error?
end
2018-03-08 22:20:21 +00:00
2018-03-10 00:45:48 +00:00
command.each do |cmd|
2018-03-13 18:07:41 +00:00
trigger = create_trigger(cmd, blk)
@_after_triggers << trigger
2018-03-10 00:45:48 +00:00
end
end
#-------------------------------------------------------------------
# Internal methods, don't call these.
#-------------------------------------------------------------------
2018-03-10 00:45:48 +00:00
# Creates a new trigger config. If a block is given, parse that block
# by calling it with the created trigger. Otherwise set the options if it's
# a hash.
#
2018-03-13 18:07:41 +00:00
# @param [Symbol] command Vagrant command to create trigger on
# @param [Block] block The defined config block
# @return [VagrantConfigTrigger]
2018-03-13 18:07:41 +00:00
def create_trigger(command, block)
2018-03-13 18:13:25 +00:00
trigger = VagrantConfigTrigger.new(command)
2018-03-13 18:07:41 +00:00
if block.is_a?(Hash)
trigger.set_options(block)
else
block.call(trigger, VagrantConfigTrigger)
end
return trigger
end
# Solve the mystery of disappearing state??
def merge(other)
super.tap do |result|
new_before_triggers = []
new_after_triggers = []
other_defined_before_triggers = other.instance_variable_get(:@_before_triggers)
other_defined_after_triggers = other.instance_variable_get(:@_after_triggers)
# TODO: Is this the right solution?
# If a guest in a Vagrantfile exists beyond the default, this check
# will properly set up the defined triggers and validate them.
# overrides??? check for duplicate ids?
if other_defined_before_triggers.empty? && !@_before_triggers.empty?
result.instance_variable_set(:@_before_triggers, @_before_triggers)
end
if other_defined_before_triggers.empty? && !@_after_triggers.empty?
result.instance_variable_set(:@_after_triggers, @_after_triggers)
end
end
end
2018-03-08 22:20:21 +00:00
def finalize!
# read through configured settings blocks and set their values
# and then set up action hooks here?
if !@_before_triggers.empty?
@_before_triggers.map { |t| t.finalize! }
end
if !@_after_triggers.empty?
@_after_triggers.map { |t| t.finalize! }
end
2018-03-08 22:20:21 +00:00
end
2018-03-15 21:43:39 +00:00
# Validate Trigger Arrays
2018-03-08 22:20:21 +00:00
def validate(machine)
2018-03-09 21:06:26 +00:00
errors = _detected_errors
@_before_triggers.each do |bt|
error = bt.validate(machine)
errors.concat error if !error.empty?
end
@_after_triggers.each do |at|
error = at.validate(machine)
errors.concat error if !error.empty?
end
2018-03-09 21:06:26 +00:00
{"trigger" => errors}
2018-03-08 22:20:21 +00:00
end
# The String representation of this Trigger.
#
# @return [String]
def to_s
"trigger"
2018-03-08 22:20:21 +00:00
end
end
end
end