packer: Add errors to Prepare

This commit is contained in:
Mitchell Hashimoto 2013-06-06 17:07:42 -07:00
parent 09f5cd5090
commit 0a6d8ed75a
8 changed files with 28 additions and 13 deletions

View File

@ -13,13 +13,13 @@ type cmdProvisioner struct {
client *client client *client
} }
func (c *cmdProvisioner) Prepare(configs ...interface{}) { func (c *cmdProvisioner) Prepare(configs ...interface{}) error {
defer func() { defer func() {
r := recover() r := recover()
c.checkExit(r, nil) c.checkExit(r, nil)
}() }()
c.p.Prepare(configs...) return c.p.Prepare(configs...)
} }
func (c *cmdProvisioner) Provision(ui packer.Ui, comm packer.Communicator) { func (c *cmdProvisioner) Provision(ui packer.Ui, comm packer.Communicator) {

View File

@ -9,7 +9,9 @@ import (
type helperProvisioner byte type helperProvisioner byte
func (helperProvisioner) Prepare(...interface{}) {} func (helperProvisioner) Prepare(...interface{}) error {
return nil
}
func (helperProvisioner) Provision(packer.Ui, packer.Communicator) {} func (helperProvisioner) Provision(packer.Ui, packer.Communicator) {}

View File

@ -6,7 +6,7 @@ type Provisioner interface {
// Prepare is called with a set of configurations to setup the // Prepare is called with a set of configurations to setup the
// internal state of the provisioner. The multiple configurations // internal state of the provisioner. The multiple configurations
// should be merged in some sane way. // should be merged in some sane way.
Prepare(...interface{}) Prepare(...interface{}) error
// Provision is called to actually provision the machine. A UI is // Provision is called to actually provision the machine. A UI is
// given to communicate with the user, and a communicator is given that // given to communicate with the user, and a communicator is given that

View File

@ -8,9 +8,10 @@ type TestProvisioner struct {
provCalled bool provCalled bool
} }
func (t *TestProvisioner) Prepare(configs ...interface{}) { func (t *TestProvisioner) Prepare(configs ...interface{}) error {
t.prepCalled = true t.prepCalled = true
t.prepConfigs = configs t.prepConfigs = configs
return nil
} }
func (t *TestProvisioner) Provision(Ui, Communicator) { func (t *TestProvisioner) Provision(Ui, Communicator) {

View File

@ -28,9 +28,13 @@ type ProvisionerProvisionArgs struct {
func Provisioner(client *rpc.Client) *provisioner { func Provisioner(client *rpc.Client) *provisioner {
return &provisioner{client} return &provisioner{client}
} }
func (p *provisioner) Prepare(configs ...interface{}) { func (p *provisioner) Prepare(configs ...interface{}) (err error) {
args := &ProvisionerPrepareArgs{configs} args := &ProvisionerPrepareArgs{configs}
p.client.Call("Provisioner.Prepare", args, new(interface{})) if cerr := p.client.Call("Provisioner.Prepare", args, &err); cerr != nil {
err = cerr
}
return
} }
func (p *provisioner) Provision(ui packer.Ui, comm packer.Communicator) { func (p *provisioner) Provision(ui packer.Ui, comm packer.Communicator) {
@ -43,8 +47,8 @@ func (p *provisioner) Provision(ui packer.Ui, comm packer.Communicator) {
p.client.Call("Provisioner.Provision", args, new(interface{})) p.client.Call("Provisioner.Provision", args, new(interface{}))
} }
func (p *ProvisionerServer) Prepare(args *ProvisionerPrepareArgs, reply *interface{}) error { func (p *ProvisionerServer) Prepare(args *ProvisionerPrepareArgs, reply *error) error {
p.p.Prepare(args.Configs...) *reply = p.p.Prepare(args.Configs...)
return nil return nil
} }

View File

@ -15,9 +15,10 @@ type testProvisioner struct {
provUi packer.Ui provUi packer.Ui
} }
func (p *testProvisioner) Prepare(configs ...interface{}) { func (p *testProvisioner) Prepare(configs ...interface{}) error {
p.prepareCalled = true p.prepareCalled = true
p.prepareConfigs = configs p.prepareConfigs = configs
return nil
} }
func (p *testProvisioner) Provision(ui packer.Ui, comm packer.Communicator) { func (p *testProvisioner) Provision(ui packer.Ui, comm packer.Communicator) {

View File

@ -29,15 +29,19 @@ type Provisioner struct {
config config config config
} }
func (p *Provisioner) Prepare(raws ...interface{}) { func (p *Provisioner) Prepare(raws ...interface{}) error {
// TODO: errors // TODO: errors
for _, raw := range raws { for _, raw := range raws {
_ = mapstructure.Decode(raw, &p.config) if err := mapstructure.Decode(raw, &p.config); err != nil {
return err
}
} }
if p.config.RemotePath == "" { if p.config.RemotePath == "" {
p.config.RemotePath = DefaultRemotePath p.config.RemotePath = DefaultRemotePath
} }
return nil
} }
func (p *Provisioner) Provision(ui packer.Ui, comm packer.Communicator) { func (p *Provisioner) Provision(ui packer.Ui, comm packer.Communicator) {

View File

@ -17,7 +17,10 @@ func TestProvisionerPrepare_Defaults(t *testing.T) {
raw := map[string]interface{}{} raw := map[string]interface{}{}
p := &Provisioner{} p := &Provisioner{}
p.Prepare(raw, nil) err := p.Prepare(raw)
if err != nil {
t.Fatalf("err: %s", err)
}
if p.config.RemotePath != DefaultRemotePath { if p.config.RemotePath != DefaultRemotePath {
t.Errorf("unexpected remote path: %s", p.config.RemotePath) t.Errorf("unexpected remote path: %s", p.config.RemotePath)