diff --git a/builder/openstack-new/ssh.go b/builder/openstack-new/ssh.go index a3de654f6..7b0510f98 100644 --- a/builder/openstack-new/ssh.go +++ b/builder/openstack-new/ssh.go @@ -3,6 +3,7 @@ package openstack import ( "errors" "fmt" + "log" "time" "github.com/mitchellh/multistep" @@ -21,7 +22,8 @@ func SSHAddress( s := state.Get("server").(*servers.Server) // If we have a floating IP, use that - if ip := state.Get("access_ip").(*floatingip.FloatingIP); ip.FixedIP != "" { + ip := state.Get("access_ip").(*floatingip.FloatingIP) + if ip != nil && ip.FixedIP != "" { return fmt.Sprintf("%s:%d", ip.FixedIP, port), nil } @@ -29,33 +31,34 @@ func SSHAddress( return fmt.Sprintf("%s:%d", s.AccessIPv4, port), nil } - // Get all the addresses associated with this server - /* - ip_pools, err := s.AllAddressPools() - if err != nil { - return "", errors.New("Error parsing SSH addresses") + // Get all the addresses associated with this server. This + // was taken directly from Terraform. + for _, networkAddresses := range s.Addresses { + elements, ok := networkAddresses.([]interface{}) + if !ok { + log.Printf( + "[ERROR] Unknown return type for address field: %#v", + networkAddresses) + continue } - for pool, addresses := range ip_pools { - if sshinterface != "" { - if pool != sshinterface { - continue - } - } - if pool != "" { - for _, address := range addresses { - if address.Addr != "" && address.Version == 4 { - return fmt.Sprintf("%s:%d", address.Addr, port), nil - } - } - } - } - */ - result := servers.Get(client, s.ID) - err := result.Err - if err == nil { - s, err = result.Extract() + for _, element := range elements { + var addr string + address := element.(map[string]interface{}) + if address["OS-EXT-IPS:type"] == "floating" { + addr = address["addr"].(string) + } else { + if address["version"].(float64) == 4 { + addr = address["addr"].(string) + } + } + if addr != "" { + return fmt.Sprintf("%s:%d", addr, port), nil + } + } } + + s, err := servers.Get(client, s.ID).Extract() if err != nil { return "", err } diff --git a/builder/openstack-new/step_allocate_ip.go b/builder/openstack-new/step_allocate_ip.go index adb15eb5b..16efe8d38 100644 --- a/builder/openstack-new/step_allocate_ip.go +++ b/builder/openstack-new/step_allocate_ip.go @@ -33,7 +33,7 @@ func (s *StepAllocateIp) Run(state multistep.StateBag) multistep.StepAction { state.Put("access_ip", instanceIp) if s.FloatingIp != "" { - instanceIp.FixedIP = s.FloatingIp + *instanceIp = floatingip.FloatingIP{FixedIP: s.FloatingIp} } else if s.FloatingIpPool != "" { newIp, err := floatingip.Create(client, floatingip.CreateOpts{ Pool: s.FloatingIpPool, @@ -45,11 +45,11 @@ func (s *StepAllocateIp) Run(state multistep.StateBag) multistep.StepAction { return multistep.ActionHalt } - instanceIp = newIp + *instanceIp = *newIp ui.Say(fmt.Sprintf("Created temporary floating IP %s...", instanceIp.FixedIP)) } - if instanceIp.FixedIP != "" { + if instanceIp != nil && instanceIp.FixedIP != "" { err := floatingip.Associate(client, server.ID, instanceIp.FixedIP).ExtractErr() if err != nil { err := fmt.Errorf( @@ -65,7 +65,6 @@ func (s *StepAllocateIp) Run(state multistep.StateBag) multistep.StepAction { } state.Put("access_ip", instanceIp) - return multistep.ActionContinue } diff --git a/builder/openstack-new/step_run_source_server.go b/builder/openstack-new/step_run_source_server.go index e58e2c46b..4432d5860 100644 --- a/builder/openstack-new/step_run_source_server.go +++ b/builder/openstack-new/step_run_source_server.go @@ -42,7 +42,7 @@ func (s *StepRunSourceServer) Run(state multistep.StateBag) multistep.StepAction CreateOptsBuilder: servers.CreateOpts{ Name: s.Name, ImageRef: s.SourceImage, - FlavorRef: s.Flavor, + FlavorName: s.Flavor, SecurityGroups: s.SecurityGroups, Networks: networks, },