Skip to content
This repository has been archived by the owner on Sep 26, 2021. It is now read-only.

Commit

Permalink
Fixed openstack-net-name after last commit and added support for defi…
Browse files Browse the repository at this point in the history
…ning floating ip target network

Signed-off-by: Turo Soisenniemi <[email protected]>
  • Loading branch information
Turmio committed Mar 20, 2019
1 parent e914060 commit c413353
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 57 deletions.
49 changes: 16 additions & 33 deletions drivers/openstack/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,11 @@ type Client interface {
GetPublicKey(keyPairName string) ([]byte, error)
CreateKeyPair(d *Driver, name string, publicKey string) error
DeleteKeyPair(d *Driver, name string) error
GetNetworkID(d *Driver) (string, error)
GetNetworkIDs(networkNames []string) (string, error)
GetFlavorID(d *Driver) (string, error)
GetImageID(d *Driver) (string, error)
AssignFloatingIP(d *Driver, floatingIP *FloatingIP) error
GetFloatingIPs(d *Driver) ([]FloatingIP, error)
GetFloatingIPPoolID(d *Driver) (string, error)
GetInstancePortID(d *Driver) (string, error)
GetTenantID(d *Driver) (string, error)
}
Expand Down Expand Up @@ -206,29 +205,22 @@ func (c *GenericClient) GetInstanceIPAddresses(d *Driver) ([]IPAddress, error) {
return addresses, nil
}

func (c *GenericClient) GetNetworkID(d *Driver) (string, error) {
return c.getNetworkID(d, d.NetworkName)
}

func (c *GenericClient) GetFloatingIPPoolID(d *Driver) (string, error) {
return c.getNetworkID(d, d.FloatingIpPool)
}

func Contains(slice []string, element string) (bool, int) {
for i, e := range slice {
if e == element {
return true, i
func (c *GenericClient) GetNetworkIDs(networkNames []string) (string, error) {
ips := []string{}
for _, name := range networkNames {
id, err := c.getNetworkID(name)
if err != nil {
return "", err
}
ips = append(ips, id)
}
return false, -1
return strings.Join(ips, ","), nil
}

func (c *GenericClient) getNetworkID(d *Driver, networkName string) (string, error) {
func (c *GenericClient) getNetworkID(networkName string) (string, error) {
opts := networks.ListOpts{Name: networkName}
pager := networks.List(c.Network, opts)
networkNames := strings.Split(networkName, ",")
remainingNetworks := len(networkNames)
networkID := make([]string, remainingNetworks)
networkID := ""

err := pager.EachPage(func(page pagination.Page) (bool, error) {
networkList, err := networks.ExtractNetworks(page)
Expand All @@ -237,25 +229,16 @@ func (c *GenericClient) getNetworkID(d *Driver, networkName string) (string, err
}

for _, n := range networkList {
match, index := Contains(networkNames, n.Name)
if match {
networkID[index] = n.ID
remainingNetworks--

if remainingNetworks == 0 {
return false, nil
}
if n.Name == networkName {
networkID = n.ID
return false, nil
}
}

return true, nil
})

if remainingNetworks != 0 {
return "", err
}

return strings.Join(networkID, ","), err
return networkID, err
}

func (c *GenericClient) GetFlavorID(d *Driver) (string, error) {
Expand Down Expand Up @@ -476,7 +459,7 @@ func (c *GenericClient) getNeutronNetworkFloatingIPs(d *Driver) ([]FloatingIP, e
func (c *GenericClient) GetInstancePortID(d *Driver) (string, error) {
pager := ports.List(c.Network, ports.ListOpts{
DeviceID: d.MachineId,
NetworkID: strings.Split(d.NetworkId, ",")[0],
NetworkID: d.FloatingIpNetworkId,
})

var portID string
Expand Down
58 changes: 52 additions & 6 deletions drivers/openstack/openstack.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@ type Driver struct {
client Client
// ExistingKey keeps track of whether the key was created by us or we used an existing one. If an existing one was used, we shouldn't delete it when the machine is deleted.
ExistingKey bool
// To get right port id, if multiple networks are configured and first one is not the one for floating ip.
FloatingIpNetworkName string
FloatingIpNetworkId string
}

const (
Expand Down Expand Up @@ -202,7 +205,19 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag {
mcnflag.StringFlag{
EnvVar: "OS_FLOATINGIP_POOL",
Name: "openstack-floatingip-pool",
Usage: "OpenStack floating IP pool to get an IP from to assign to the instance (first network only)",
Usage: "OpenStack floating IP pool to get an IP from to assign to the instance.",
Value: "",
},
mcnflag.StringFlag{
EnvVar: "OS_FLOATINGIP_NETWORK_NAME",
Name: "openstack-floatingip-net-name",
Usage: "OpenStack floating IP target network name to get right port for assingin IP.",
Value: "",
},
mcnflag.StringFlag{
EnvVar: "OS_FLOATINGIP_NETWORK_ID",
Name: "openstack-floatingip-net-id",
Usage: "OpenStack floating IP target network id to get right port for assingin IP.",
Value: "",
},
mcnflag.IntFlag{
Expand Down Expand Up @@ -298,6 +313,8 @@ func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error {
d.SecurityGroups = strings.Split(flags.String("openstack-sec-groups"), ",")
}
d.FloatingIpPool = flags.String("openstack-floatingip-pool")
d.FloatingIpNetworkName = flags.String("openstack-floatingip-net-name")
d.FloatingIpNetworkId = flags.String("openstack-floatingip-net-id")
d.IpVersion = flags.Int("openstack-ip-version")
d.ComputeNetwork = flags.Bool("openstack-nova-network")
d.SSHUser = flags.String("openstack-ssh-user")
Expand Down Expand Up @@ -561,6 +578,9 @@ func (d *Driver) checkConfig() error {
if (d.KeyPairName != "" && d.PrivateKeyFile == "") || (d.KeyPairName == "" && d.PrivateKeyFile != "") {
return fmt.Errorf(errorBothOptions, "KeyPairName", "PrivateKeyFile")
}
if d.FloatingIpNetworkName != "" && d.FloatingIpNetworkId != "" {
return fmt.Errorf(errorBothOptions, "FloatingIpNetworkName", "FloatingIpNetworkId")
}
return nil
}

Expand All @@ -570,7 +590,7 @@ func (d *Driver) resolveIds() error {
return err
}

networkIDs, err := d.client.GetNetworkID(d)
networkIDs, err := d.client.GetNetworkIDs(strings.Split(d.NetworkName, ","))

if err != nil {
return err
Expand All @@ -581,7 +601,10 @@ func (d *Driver) resolveIds() error {
}

d.NetworkId = networkIDs
//TODO: log found networks?
log.Debug("Found networks using their name", map[string]string{
"Names": d.NetworkName,
"IDs": d.NetworkId,
})
}

if d.FlavorName != "" {
Expand Down Expand Up @@ -630,23 +653,46 @@ func (d *Driver) resolveIds() error {
if err := d.initNetwork(); err != nil {
return err
}
f, err := d.client.GetFloatingIPPoolID(d)

networkID, err := d.client.GetNetworkIDs([]string{d.FloatingIpPool})

if err != nil {
return err
}

if f == "" {
if networkID == "" {
return fmt.Errorf(errorUnknownNetworkName, d.FloatingIpPool)
}

d.FloatingIpPoolId = f
d.FloatingIpPoolId = networkID
log.Debug("Found floating IP pool id using its name", map[string]string{
"Name": d.FloatingIpPool,
"ID": d.FloatingIpPoolId,
})
}

if d.FloatingIpNetworkId == "" && !d.ComputeNetwork {
d.FloatingIpNetworkId = strings.Split(d.NetworkId, ",")[0]
log.Debug("Using first network as floating ip network")
} else if d.FloatingIpNetworkName != "" && !d.ComputeNetwork {
if err := d.initNetwork(); err != nil {
return err
}

networkID, err := d.client.GetNetworkIDs([]string{d.FloatingIpNetworkName})

if err != nil {
return err
}

d.FloatingIpNetworkId = networkID

log.Debug("Found floating network for floating ip using its name", map[string]string{
"Name": d.FloatingIpNetworkName,
"ID": d.FloatingIpNetworkId,
})
}

if d.TenantName != "" && d.TenantId == "" {
if err := d.initIdentity(); err != nil {
return err
Expand Down
34 changes: 16 additions & 18 deletions drivers/openstack/openstack_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,15 +77,14 @@ func TestSetMultipleNetworkIds(t *testing.T) {

checkFlags := &drivers.CheckDriverOptions{
FlagsValues: map[string]interface{}{
"openstack-auth-url": "http://url",
"openstack-username": "user",
"openstack-password": "pwd",
"openstack-tenant-id": "ID",
"openstack-flavor-id": "ID",
"openstack-image-id": "ID",
//TODO: multivalue test
//"openstack-net-id": "ID",
"openstack-net-id": "ID2",
"openstack-auth-url": "http://url",
"openstack-username": "user",
"openstack-password": "pwd",
"openstack-tenant-id": "ID",
"openstack-flavor-id": "ID",
"openstack-image-id": "ID",
"openstack-net-id": []string{"ID", "ID2"},
"openstack-floatingip-net-id": "ID2",
},
CreateFlags: driver.GetCreateFlags(),
}
Expand All @@ -101,15 +100,14 @@ func TestSetMultipleNetworkNames(t *testing.T) {

checkFlags := &drivers.CheckDriverOptions{
FlagsValues: map[string]interface{}{
"openstack-auth-url": "http://url",
"openstack-username": "user",
"openstack-password": "pwd",
"openstack-tenant-id": "ID",
"openstack-flavor-id": "ID",
"openstack-image-id": "ID",
"openstack-net-name": "ID",
//TODO: multivalue test
//"openstack-net-name": "ID2",
"openstack-auth-url": "http://url",
"openstack-username": "user",
"openstack-password": "pwd",
"openstack-tenant-id": "ID",
"openstack-flavor-id": "ID",
"openstack-image-id": "ID",
"openstack-net-name": []string{"ID", "ID2"},
"openstack-floatingip-net-name": "ID2",
},
CreateFlags: driver.GetCreateFlags(),
}
Expand Down

0 comments on commit c413353

Please sign in to comment.