packer-cn/builder/vagrant/step_up.go

74 lines
1.6 KiB
Go
Raw Normal View History

2019-01-11 17:06:15 -05:00
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
2019-01-11 17:06:15 -05:00
}
func (s *StepUp) generateArgs() []string {
box := "source"
if s.GlobalID != "" {
box = s.GlobalID
}
// start only the source box
args := []string{box}
2019-01-11 17:06:15 -05:00
if s.Provider != "" {
args = append(args, fmt.Sprintf("--provider=%s", s.Provider))
}
return args
}
2019-01-11 17:06:15 -05:00
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 (this can take some time)...")
_, _, err := driver.Up(s.generateArgs())
2019-01-11 17:06:15 -05:00
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))
box := "source"
if s.GlobalID != "" {
box = s.GlobalID
}
2019-01-11 17:06:15 -05:00
var err error
if s.TeardownMethod == "halt" {
err = driver.Halt(box)
2019-01-11 17:06:15 -05:00
} else if s.TeardownMethod == "suspend" {
err = driver.Suspend(box)
2019-01-11 17:06:15 -05:00
} else if s.TeardownMethod == "destroy" {
err = driver.Destroy(box)
2019-01-11 17:06:15 -05:00
} else {
// Should never get here because of template validation
2019-09-10 17:31:00 -04:00
state.Put("error", fmt.Errorf("Invalid teardown method selected; must be either halt, suspend, or destroy."))
2019-01-11 17:06:15 -05:00
}
if err != nil {
state.Put("error", fmt.Errorf("Error halting Vagrant machine; please try to do this manually"))
}
}