Commit 0e98b2a2 authored by Prasanna Santhanam's avatar Prasanna Santhanam

Fixes #867: save private key when debugging gce builder

Signed-off-by: default avatarPrasanna Santhanam <tsp@qubole.com>
parent 1a57e389
...@@ -5,7 +5,7 @@ package googlecompute ...@@ -5,7 +5,7 @@ package googlecompute
import ( import (
"log" "log"
"time" "time"
"fmt"
"github.com/mitchellh/multistep" "github.com/mitchellh/multistep"
"github.com/mitchellh/packer/common" "github.com/mitchellh/packer/common"
"github.com/mitchellh/packer/packer" "github.com/mitchellh/packer/packer"
...@@ -48,21 +48,28 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe ...@@ -48,21 +48,28 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
state.Put("ui", ui) state.Put("ui", ui)
// Build the steps. // Build the steps.
steps := []multistep.Step{ steps := []multistep.Step{
new(StepCreateSSHKey), &StepCreateSSHKey{
new(StepCreateInstance), Debug: b.config.PackerDebug,
new(StepInstanceInfo), DebugKeyPath: fmt.Sprintf("gce_%s.pem", b.config.PackerBuildName),
&common.StepConnectSSH{ },
SSHAddress: sshAddress, &StepCreateInstance{
SSHConfig: sshConfig, Debug: b.config.PackerDebug,
SSHWaitTimeout: 5 * time.Minute, },
}, &StepInstanceInfo{
new(common.StepProvision), Debug: b.config.PackerDebug,
new(StepUpdateGsutil), },
new(StepCreateImage), &common.StepConnectSSH{
new(StepUploadImage), SSHAddress: sshAddress,
new(StepRegisterImage), SSHConfig: sshConfig,
} SSHWaitTimeout: 5 * time.Minute,
},
new(common.StepProvision),
new(StepUpdateGsutil),
new(StepCreateImage),
new(StepUploadImage),
new(StepRegisterImage),
}
// Run the steps. // Run the steps.
if b.config.PackerDebug { if b.config.PackerDebug {
......
...@@ -13,6 +13,7 @@ import ( ...@@ -13,6 +13,7 @@ import (
// StepCreateInstance represents a Packer build step that creates GCE instances. // StepCreateInstance represents a Packer build step that creates GCE instances.
type StepCreateInstance struct { type StepCreateInstance struct {
instanceName string instanceName string
Debug bool
} }
// Run executes the Packer build step that creates a GCE instance. // Run executes the Packer build step that creates a GCE instance.
...@@ -56,6 +57,12 @@ func (s *StepCreateInstance) Run(state multistep.StateBag) multistep.StepAction ...@@ -56,6 +57,12 @@ func (s *StepCreateInstance) Run(state multistep.StateBag) multistep.StepAction
ui.Message("Instance has been created!") ui.Message("Instance has been created!")
if s.Debug {
if name != "" {
ui.Message(fmt.Sprintf("Instance: %s started in %s", name, config.Zone))
}
}
// Things succeeded, store the name so we can remove it later // Things succeeded, store the name so we can remove it later
state.Put("instance_name", name) state.Put("instance_name", name)
s.instanceName = name s.instanceName = name
......
...@@ -5,15 +5,19 @@ import ( ...@@ -5,15 +5,19 @@ import (
"crypto/rsa" "crypto/rsa"
"crypto/x509" "crypto/x509"
"encoding/pem" "encoding/pem"
"os"
"fmt" "fmt"
"code.google.com/p/go.crypto/ssh" "code.google.com/p/go.crypto/ssh"
"github.com/mitchellh/multistep" "github.com/mitchellh/multistep"
"github.com/mitchellh/packer/packer" "github.com/mitchellh/packer/packer"
) )
// StepCreateSSHKey represents a Packer build step that generates SSH key pairs. // StepCreateSSHKey represents a Packer build step that generates SSH key pairs.
type StepCreateSSHKey int type StepCreateSSHKey struct {
key int
Debug bool
DebugKeyPath string
}
// Run executes the Packer build step that generates SSH key pairs. // Run executes the Packer build step that generates SSH key pairs.
func (s *StepCreateSSHKey) Run(state multistep.StateBag) multistep.StepAction { func (s *StepCreateSSHKey) Run(state multistep.StateBag) multistep.StepAction {
...@@ -41,9 +45,20 @@ func (s *StepCreateSSHKey) Run(state multistep.StateBag) multistep.StepAction { ...@@ -41,9 +45,20 @@ func (s *StepCreateSSHKey) Run(state multistep.StateBag) multistep.StepAction {
ui.Error(err.Error()) ui.Error(err.Error())
return multistep.ActionHalt return multistep.ActionHalt
} }
state.Put("ssh_private_key", string(pem.EncodeToMemory(&priv_blk)))
state.Put("ssh_public_key", string(ssh.MarshalAuthorizedKey(pub)))
state.Put("ssh_private_key", string(pem.EncodeToMemory(&priv_blk))) if s.Debug {
state.Put("ssh_public_key", string(ssh.MarshalAuthorizedKey(pub))) ui.Message(fmt.Sprintf("Saving key for debug purposes: %s", s.DebugKeyPath))
f, err := os.OpenFile(s.DebugKeyPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)
if err != nil {
state.Put("error", fmt.Errorf("Error saving debug key: %s", err))
return multistep.ActionHalt
}
// Write out the key
pem.Encode(f, &priv_blk)
f.Close()
}
return multistep.ActionContinue return multistep.ActionContinue
} }
......
...@@ -10,7 +10,10 @@ import ( ...@@ -10,7 +10,10 @@ import (
) )
// stepInstanceInfo represents a Packer build step that gathers GCE instance info. // stepInstanceInfo represents a Packer build step that gathers GCE instance info.
type StepInstanceInfo int type StepInstanceInfo struct {
info int
Debug bool
}
// Run executes the Packer build step that gathers GCE instance info. // Run executes the Packer build step that gathers GCE instance info.
func (s *StepInstanceInfo) Run(state multistep.StateBag) multistep.StepAction { func (s *StepInstanceInfo) Run(state multistep.StateBag) multistep.StepAction {
...@@ -44,6 +47,12 @@ func (s *StepInstanceInfo) Run(state multistep.StateBag) multistep.StepAction { ...@@ -44,6 +47,12 @@ func (s *StepInstanceInfo) Run(state multistep.StateBag) multistep.StepAction {
return multistep.ActionHalt return multistep.ActionHalt
} }
if s.Debug {
if ip != "" {
ui.Message(fmt.Sprintf("Public IP: %s", ip))
}
}
ui.Message(fmt.Sprintf("IP: %s", ip)) ui.Message(fmt.Sprintf("IP: %s", ip))
state.Put("instance_ip", ip) state.Put("instance_ip", ip)
return multistep.ActionContinue return multistep.ActionContinue
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment