OpenStack builder: do not always use floating IPs

Only associate floating IPs if user provided "floating_ip_network" or
"floating_ip".
Remove FindExternalNetwork helper method because it won't be used.
This commit is contained in:
Andrei Ozerov 2018-08-17 00:49:06 +03:00
parent 5d6ba4301d
commit 103403db48
2 changed files with 23 additions and 65 deletions

View File

@ -12,38 +12,6 @@ import (
"github.com/gophercloud/gophercloud/pagination" "github.com/gophercloud/gophercloud/pagination"
) )
// ExternalNetwork is a network with external router.
type ExternalNetwork struct {
networks.Network
external.NetworkExternalExt
}
// FindExternalNetwork returns existing network with external router.
// It will return first network if there are many.
func FindExternalNetwork(client *gophercloud.ServiceClient) (*ExternalNetwork, error) {
var externalNetworks []ExternalNetwork
allPages, err := networks.List(client, networks.ListOpts{
Status: "ACTIVE",
}).AllPages()
if err != nil {
return nil, err
}
// Extract external networks from found networks.
err = networks.ExtractNetworksInto(allPages, &externalNetworks)
if err != nil {
return nil, err
}
if len(externalNetworks) == 0 {
return nil, fmt.Errorf("no external networks found")
}
// Return the first external network.
return &externalNetworks[0], nil
}
// CheckFloatingIP gets a floating IP by its ID and checks if it is already // CheckFloatingIP gets a floating IP by its ID and checks if it is already
// associated with any internal interface. // associated with any internal interface.
// It returns floating IP if it can be used. // It returns floating IP if it can be used.
@ -114,18 +82,24 @@ func GetInstancePortID(client *gophercloud.ServiceClient, id string) (string, er
return interfaces[0].PortID, nil return interfaces[0].PortID, nil
} }
// CheckExternalNetworkRef checks provided network reference and returns a valid // CheckFloatingIPNetwork checks provided network reference and returns a valid
// Networking service ID. // Networking service ID.
func CheckExternalNetworkRef(client *gophercloud.ServiceClient, networkRef string) (string, error) { func CheckFloatingIPNetwork(client *gophercloud.ServiceClient, networkRef string) (string, error) {
if _, err := uuid.Parse(networkRef); err != nil { if _, err := uuid.Parse(networkRef); err != nil {
return GetExternalNetworkIDByName(client, networkRef) return GetFloatingIPNetworkIDByName(client, networkRef)
} }
return networkRef, nil return networkRef, nil
} }
// GetExternalNetworkIDByName searches for the external network ID by the provided name. // ExternalNetwork is a network with external router.
func GetExternalNetworkIDByName(client *gophercloud.ServiceClient, networkName string) (string, error) { type ExternalNetwork struct {
networks.Network
external.NetworkExternalExt
}
// GetFloatingIPNetworkIDByName searches for the external network ID by the provided name.
func GetFloatingIPNetworkIDByName(client *gophercloud.ServiceClient, networkName string) (string, error) {
var externalNetworks []ExternalNetwork var externalNetworks []ExternalNetwork
allPages, err := networks.List(client, networks.ListOpts{ allPages, err := networks.List(client, networks.ListOpts{

View File

@ -43,8 +43,9 @@ func (s *StepAllocateIp) Run(_ context.Context, state multistep.StateBag) multis
// statebag below, because it is requested by Cleanup() // statebag below, because it is requested by Cleanup()
state.Put("access_ip", &instanceIP) state.Put("access_ip", &instanceIP)
// Try to use floating IP provided by the user or find a free floating IP. // WRITE NEW COMMENT>
if s.FloatingIP != "" { if s.FloatingIP != "" {
// Try to use FloatingIP if it was provided by the user.
freeFloatingIP, err := CheckFloatingIP(networkClient, s.FloatingIP) freeFloatingIP, err := CheckFloatingIP(networkClient, s.FloatingIP)
if err != nil { if err != nil {
err := fmt.Errorf("Error using provided floating IP '%s': %s", s.FloatingIP, err) err := fmt.Errorf("Error using provided floating IP '%s': %s", s.FloatingIP, err)
@ -71,32 +72,15 @@ func (s *StepAllocateIp) Run(_ context.Context, state multistep.StateBag) multis
instanceIP = *freeFloatingIP instanceIP = *freeFloatingIP
ui.Message(fmt.Sprintf("Selected floating IP: '%s' (%s)", instanceIP.ID, instanceIP.FloatingIP)) ui.Message(fmt.Sprintf("Selected floating IP: '%s' (%s)", instanceIP.ID, instanceIP.FloatingIP))
state.Put("floatingip_istemp", false) state.Put("floatingip_istemp", false)
} } else if s.FloatingIPNetwork != "" {
// Lastly, if FloatingIPNetwork was provided by the user, we need to use it
// Create a new floating IP if it wasn't obtained in the previous step. // to allocate a new floating IP and associate it to the instance.
if instanceIP.ID == "" { floatingNetwork, err := CheckFloatingIPNetwork(networkClient, s.FloatingIPNetwork)
var floatingNetwork string if err != nil {
err := fmt.Errorf("Error using the provided floating_ip_network: %s", err)
if s.FloatingIPNetwork != "" { state.Put("error", err)
// Validate provided external network reference and get an ID. ui.Error(err.Error())
floatingNetwork, err = CheckExternalNetworkRef(networkClient, s.FloatingIPNetwork) return multistep.ActionHalt
if err != nil {
err := fmt.Errorf("Error using the provided floating_ip_network: %s", err)
state.Put("error", err)
ui.Error(err.Error())
return multistep.ActionHalt
}
} else {
// Search for the external network that can be used for the floating IPs.
ui.Say(fmt.Sprintf("Searching for the external network..."))
externalNetwork, err := FindExternalNetwork(networkClient)
if err != nil {
err := fmt.Errorf("Error searching the external network: %s", err)
state.Put("error", err)
ui.Error(err.Error())
return multistep.ActionHalt
}
floatingNetwork = externalNetwork.ID
} }
ui.Say(fmt.Sprintf("Creating floating IP using network %s ...", floatingNetwork)) ui.Say(fmt.Sprintf("Creating floating IP using network %s ...", floatingNetwork))
@ -115,7 +99,7 @@ func (s *StepAllocateIp) Run(_ context.Context, state multistep.StateBag) multis
state.Put("floatingip_istemp", true) state.Put("floatingip_istemp", true)
} }
// Assoctate a floating IP that was obtained in the previous steps. // Assoctate a floating IP if it was obtained in the previous steps.
if instanceIP.ID != "" { if instanceIP.ID != "" {
ui.Say(fmt.Sprintf("Associating floating IP '%s' (%s) with instance port...", ui.Say(fmt.Sprintf("Associating floating IP '%s' (%s) with instance port...",
instanceIP.ID, instanceIP.FloatingIP)) instanceIP.ID, instanceIP.FloatingIP))