packer-cn/builder/vagrant/step_up.go

64 lines
1.5 KiB
Go

package vagrant
import (
"context"
"fmt"
"github.com/hashicorp/packer/helper/multistep"
"github.com/hashicorp/packer/packer"
)
type StepUp struct {
TeardownMethod string
Provider string
GlobalID string
}
func (s *StepUp) Run(ctx context.Context, state multistep.StateBag) multistep.StepAction {
driver := state.Get("driver").(VagrantDriver)
ui := state.Get("ui").(packer.Ui)
ui.Say("Calling Vagrant Up...")
// start only the source box
args := []string{"source"}
if s.GlobalID != "" {
args = append(args, s.GlobalID)
}
if s.Provider != "" {
args = append(args, fmt.Sprintf("--provider=%s", s.Provider))
}
_, _, err := driver.Up(args)
if err != nil {
state.Put("error", err)
return multistep.ActionHalt
}
return multistep.ActionContinue
}
func (s *StepUp) Cleanup(state multistep.StateBag) {
driver := state.Get("driver").(VagrantDriver)
ui := state.Get("ui").(packer.Ui)
ui.Say(fmt.Sprintf("%sing Vagrant box...", s.TeardownMethod))
var err error
if s.TeardownMethod == "halt" {
err = driver.Halt(s.GlobalID)
} else if s.TeardownMethod == "suspend" {
err = driver.Suspend(s.GlobalID)
} else if s.TeardownMethod == "destroy" {
err = driver.Destroy(s.GlobalID)
} else {
// Should never get here because of template validation
state.Put("error", fmt.Errorf("Invalid teardown method selected; must be either halt, suspend, or destory."))
}
if err != nil {
state.Put("error", fmt.Errorf("Error halting Vagrant machine; please try to do this manually"))
}
}