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"
|
"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{
|
||||||
|
|
|
@ -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))
|
||||||
|
|
Loading…
Reference in New Issue