Commit 05ecbd54 authored by Mitchell Hashimoto's avatar Mitchell Hashimoto

Merge pull request #870 from vogxn/master

builder/googlecompute: save private key when debugging gce builder
parents 4b9f9724 d4c9ed43
...@@ -3,12 +3,12 @@ ...@@ -3,12 +3,12 @@
package googlecompute package googlecompute
import ( import (
"log" "fmt"
"time"
"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"
"log"
"time"
) )
// The unique ID for this builder. // The unique ID for this builder.
...@@ -49,9 +49,16 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe ...@@ -49,9 +49,16 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
// 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),
},
&StepCreateInstance{
Debug: b.config.PackerDebug,
},
&StepInstanceInfo{
Debug: b.config.PackerDebug,
},
&common.StepConnectSSH{ &common.StepConnectSSH{
SSHAddress: sshAddress, SSHAddress: sshAddress,
SSHConfig: sshConfig, SSHConfig: sshConfig,
......
...@@ -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
......
package googlecompute package googlecompute
import ( import (
"code.google.com/p/go.crypto/ssh"
"crypto/rand" "crypto/rand"
"crypto/rsa" "crypto/rsa"
"crypto/x509" "crypto/x509"
"encoding/pem" "encoding/pem"
"fmt" "fmt"
"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"
"os"
) )
// 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_private_key", string(pem.EncodeToMemory(&priv_blk)))
state.Put("ssh_public_key", string(ssh.MarshalAuthorizedKey(pub))) state.Put("ssh_public_key", string(ssh.MarshalAuthorizedKey(pub)))
if s.Debug {
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