From 4e594ec22f9c11c53832ba7a4bf7c688bfcaa0b4 Mon Sep 17 00:00:00 2001 From: Devin Carlen Date: Sun, 22 Dec 2013 20:30:13 -0800 Subject: [PATCH] Added keypair logging for debugging to OpenStack builder --- builder/openstack/builder.go | 7 +++++-- builder/openstack/step_key_pair.go | 32 +++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/builder/openstack/builder.go b/builder/openstack/builder.go index 3455f087c..2ec71daf9 100644 --- a/builder/openstack/builder.go +++ b/builder/openstack/builder.go @@ -4,7 +4,7 @@ package openstack import ( - //"fmt" + "fmt" "github.com/mitchellh/multistep" "github.com/mitchellh/packer/common" "github.com/mitchellh/packer/packer" @@ -81,7 +81,10 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe // Build the steps steps := []multistep.Step{ - &StepKeyPair{}, + &StepKeyPair{ + Debug: b.config.PackerDebug, + DebugKeyPath: fmt.Sprintf("os_%s.pem", b.config.PackerBuildName), + }, &StepRunSourceServer{ Name: b.config.ImageName, Flavor: b.config.Flavor, diff --git a/builder/openstack/step_key_pair.go b/builder/openstack/step_key_pair.go index b9ffd5f4e..68535f809 100644 --- a/builder/openstack/step_key_pair.go +++ b/builder/openstack/step_key_pair.go @@ -7,10 +7,14 @@ import ( "github.com/mitchellh/packer/packer" "github.com/rackspace/gophercloud" "log" + "os" + "runtime" ) type StepKeyPair struct { - keyName string + Debug bool + DebugKeyPath string + keyName string } func (s *StepKeyPair) Run(state multistep.StateBag) multistep.StepAction { @@ -26,6 +30,32 @@ func (s *StepKeyPair) Run(state multistep.StateBag) multistep.StepAction { return multistep.ActionHalt } + // If we're in debug mode, output the private key to the working + // directory. + if s.Debug { + ui.Message(fmt.Sprintf("Saving key for debug purposes: %s", s.DebugKeyPath)) + f, err := os.Create(s.DebugKeyPath) + if err != nil { + state.Put("error", fmt.Errorf("Error saving debug key: %s", err)) + return multistep.ActionHalt + } + defer f.Close() + + // Write the key out + if _, err := f.Write([]byte(keyResp.PrivateKey)); err != nil { + state.Put("error", fmt.Errorf("Error saving debug key: %s", err)) + return multistep.ActionHalt + } + + // Chmod it so that it is SSH ready + if runtime.GOOS != "windows" { + if err := f.Chmod(0600); err != nil { + state.Put("error", fmt.Errorf("Error setting permissions of debug key: %s", err)) + return multistep.ActionHalt + } + } + } + // Set the keyname so we know to delete it later s.keyName = keyName