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:
parent
5d6ba4301d
commit
103403db48
|
@ -12,38 +12,6 @@ import (
|
|||
"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
|
||||
// associated with any internal interface.
|
||||
// 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
|
||||
}
|
||||
|
||||
// CheckExternalNetworkRef checks provided network reference and returns a valid
|
||||
// CheckFloatingIPNetwork checks provided network reference and returns a valid
|
||||
// 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 {
|
||||
return GetExternalNetworkIDByName(client, networkRef)
|
||||
return GetFloatingIPNetworkIDByName(client, networkRef)
|
||||
}
|
||||
|
||||
return networkRef, nil
|
||||
}
|
||||
|
||||
// GetExternalNetworkIDByName searches for the external network ID by the provided name.
|
||||
func GetExternalNetworkIDByName(client *gophercloud.ServiceClient, networkName string) (string, error) {
|
||||
// ExternalNetwork is a network with external router.
|
||||
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
|
||||
|
||||
allPages, err := networks.List(client, networks.ListOpts{
|
||||
|
|
|
@ -43,8 +43,9 @@ func (s *StepAllocateIp) Run(_ context.Context, state multistep.StateBag) multis
|
|||
// statebag below, because it is requested by Cleanup()
|
||||
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 != "" {
|
||||
// Try to use FloatingIP if it was provided by the user.
|
||||
freeFloatingIP, err := CheckFloatingIP(networkClient, s.FloatingIP)
|
||||
if err != nil {
|
||||
err := fmt.Errorf("Error using provided floating IP '%s': %s", s.FloatingIP, err)
|
||||
|
@ -71,33 +72,16 @@ func (s *StepAllocateIp) Run(_ context.Context, state multistep.StateBag) multis
|
|||
instanceIP = *freeFloatingIP
|
||||
ui.Message(fmt.Sprintf("Selected floating IP: '%s' (%s)", instanceIP.ID, instanceIP.FloatingIP))
|
||||
state.Put("floatingip_istemp", false)
|
||||
}
|
||||
|
||||
// Create a new floating IP if it wasn't obtained in the previous step.
|
||||
if instanceIP.ID == "" {
|
||||
var floatingNetwork string
|
||||
|
||||
if s.FloatingIPNetwork != "" {
|
||||
// Validate provided external network reference and get an ID.
|
||||
floatingNetwork, err = CheckExternalNetworkRef(networkClient, s.FloatingIPNetwork)
|
||||
} else if s.FloatingIPNetwork != "" {
|
||||
// Lastly, if FloatingIPNetwork was provided by the user, we need to use it
|
||||
// to allocate a new floating IP and associate it to the instance.
|
||||
floatingNetwork, err := CheckFloatingIPNetwork(networkClient, s.FloatingIPNetwork)
|
||||
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))
|
||||
newIP, err := floatingips.Create(networkClient, floatingips.CreateOpts{
|
||||
|
@ -115,7 +99,7 @@ func (s *StepAllocateIp) Run(_ context.Context, state multistep.StateBag) multis
|
|||
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 != "" {
|
||||
ui.Say(fmt.Sprintf("Associating floating IP '%s' (%s) with instance port...",
|
||||
instanceIP.ID, instanceIP.FloatingIP))
|
||||
|
|
Loading…
Reference in New Issue