Skip to content
This repository was archived by the owner on Jul 18, 2025. It is now read-only.

Commit c413353

Browse files
committed
Fixed openstack-net-name after last commit and added support for defining floating ip target network
Signed-off-by: Turo Soisenniemi <turo.soisenniemi@outlook.com>
1 parent e914060 commit c413353

File tree

3 files changed

+84
-57
lines changed

3 files changed

+84
-57
lines changed

‎drivers/openstack/client.go

Lines changed: 16 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,11 @@ type Client interface {
4444
GetPublicKey(keyPairName string) ([]byte, error)
4545
CreateKeyPair(d *Driver, name string, publicKey string) error
4646
DeleteKeyPair(d *Driver, name string) error
47-
GetNetworkID(d *Driver) (string, error)
47+
GetNetworkIDs(networkNames []string) (string, error)
4848
GetFlavorID(d *Driver) (string, error)
4949
GetImageID(d *Driver) (string, error)
5050
AssignFloatingIP(d *Driver, floatingIP *FloatingIP) error
5151
GetFloatingIPs(d *Driver) ([]FloatingIP, error)
52-
GetFloatingIPPoolID(d *Driver) (string, error)
5352
GetInstancePortID(d *Driver) (string, error)
5453
GetTenantID(d *Driver) (string, error)
5554
}
@@ -206,29 +205,22 @@ func (c *GenericClient) GetInstanceIPAddresses(d *Driver) ([]IPAddress, error) {
206205
return addresses, nil
207206
}
208207

209-
func (c *GenericClient) GetNetworkID(d *Driver) (string, error) {
210-
return c.getNetworkID(d, d.NetworkName)
211-
}
212-
213-
func (c *GenericClient) GetFloatingIPPoolID(d *Driver) (string, error) {
214-
return c.getNetworkID(d, d.FloatingIpPool)
215-
}
216-
217-
func Contains(slice []string, element string) (bool, int) {
218-
for i, e := range slice {
219-
if e == element {
220-
return true, i
208+
func (c *GenericClient) GetNetworkIDs(networkNames []string) (string, error) {
209+
ips := []string{}
210+
for _, name := range networkNames {
211+
id, err := c.getNetworkID(name)
212+
if err != nil {
213+
return "", err
221214
}
215+
ips = append(ips, id)
222216
}
223-
return false, -1
217+
return strings.Join(ips, ","), nil
224218
}
225219

226-
func (c *GenericClient) getNetworkID(d *Driver, networkName string) (string, error) {
220+
func (c *GenericClient) getNetworkID(networkName string) (string, error) {
227221
opts := networks.ListOpts{Name: networkName}
228222
pager := networks.List(c.Network, opts)
229-
networkNames := strings.Split(networkName, ",")
230-
remainingNetworks := len(networkNames)
231-
networkID := make([]string, remainingNetworks)
223+
networkID := ""
232224

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

239231
for _, n := range networkList {
240-
match, index := Contains(networkNames, n.Name)
241-
if match {
242-
networkID[index] = n.ID
243-
remainingNetworks--
244-
245-
if remainingNetworks == 0 {
246-
return false, nil
247-
}
232+
if n.Name == networkName {
233+
networkID = n.ID
234+
return false, nil
248235
}
249236
}
250237

251238
return true, nil
252239
})
253240

254-
if remainingNetworks != 0 {
255-
return "", err
256-
}
257-
258-
return strings.Join(networkID, ","), err
241+
return networkID, err
259242
}
260243

261244
func (c *GenericClient) GetFlavorID(d *Driver) (string, error) {
@@ -476,7 +459,7 @@ func (c *GenericClient) getNeutronNetworkFloatingIPs(d *Driver) ([]FloatingIP, e
476459
func (c *GenericClient) GetInstancePortID(d *Driver) (string, error) {
477460
pager := ports.List(c.Network, ports.ListOpts{
478461
DeviceID: d.MachineId,
479-
NetworkID: strings.Split(d.NetworkId, ",")[0],
462+
NetworkID: d.FloatingIpNetworkId,
480463
})
481464

482465
var portID string

‎drivers/openstack/openstack.go

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ type Driver struct {
5353
client Client
5454
// 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.
5555
ExistingKey bool
56+
// To get right port id, if multiple networks are configured and first one is not the one for floating ip.
57+
FloatingIpNetworkName string
58+
FloatingIpNetworkId string
5659
}
5760

5861
const (
@@ -202,7 +205,19 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag {
202205
mcnflag.StringFlag{
203206
EnvVar: "OS_FLOATINGIP_POOL",
204207
Name: "openstack-floatingip-pool",
205-
Usage: "OpenStack floating IP pool to get an IP from to assign to the instance (first network only)",
208+
Usage: "OpenStack floating IP pool to get an IP from to assign to the instance.",
209+
Value: "",
210+
},
211+
mcnflag.StringFlag{
212+
EnvVar: "OS_FLOATINGIP_NETWORK_NAME",
213+
Name: "openstack-floatingip-net-name",
214+
Usage: "OpenStack floating IP target network name to get right port for assingin IP.",
215+
Value: "",
216+
},
217+
mcnflag.StringFlag{
218+
EnvVar: "OS_FLOATINGIP_NETWORK_ID",
219+
Name: "openstack-floatingip-net-id",
220+
Usage: "OpenStack floating IP target network id to get right port for assingin IP.",
206221
Value: "",
207222
},
208223
mcnflag.IntFlag{
@@ -298,6 +313,8 @@ func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error {
298313
d.SecurityGroups = strings.Split(flags.String("openstack-sec-groups"), ",")
299314
}
300315
d.FloatingIpPool = flags.String("openstack-floatingip-pool")
316+
d.FloatingIpNetworkName = flags.String("openstack-floatingip-net-name")
317+
d.FloatingIpNetworkId = flags.String("openstack-floatingip-net-id")
301318
d.IpVersion = flags.Int("openstack-ip-version")
302319
d.ComputeNetwork = flags.Bool("openstack-nova-network")
303320
d.SSHUser = flags.String("openstack-ssh-user")
@@ -561,6 +578,9 @@ func (d *Driver) checkConfig() error {
561578
if (d.KeyPairName != "" && d.PrivateKeyFile == "") || (d.KeyPairName == "" && d.PrivateKeyFile != "") {
562579
return fmt.Errorf(errorBothOptions, "KeyPairName", "PrivateKeyFile")
563580
}
581+
if d.FloatingIpNetworkName != "" && d.FloatingIpNetworkId != "" {
582+
return fmt.Errorf(errorBothOptions, "FloatingIpNetworkName", "FloatingIpNetworkId")
583+
}
564584
return nil
565585
}
566586

@@ -570,7 +590,7 @@ func (d *Driver) resolveIds() error {
570590
return err
571591
}
572592

573-
networkIDs, err := d.client.GetNetworkID(d)
593+
networkIDs, err := d.client.GetNetworkIDs(strings.Split(d.NetworkName, ","))
574594

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

583603
d.NetworkId = networkIDs
584-
//TODO: log found networks?
604+
log.Debug("Found networks using their name", map[string]string{
605+
"Names": d.NetworkName,
606+
"IDs": d.NetworkId,
607+
})
585608
}
586609

587610
if d.FlavorName != "" {
@@ -630,23 +653,46 @@ func (d *Driver) resolveIds() error {
630653
if err := d.initNetwork(); err != nil {
631654
return err
632655
}
633-
f, err := d.client.GetFloatingIPPoolID(d)
656+
657+
networkID, err := d.client.GetNetworkIDs([]string{d.FloatingIpPool})
634658

635659
if err != nil {
636660
return err
637661
}
638662

639-
if f == "" {
663+
if networkID == "" {
640664
return fmt.Errorf(errorUnknownNetworkName, d.FloatingIpPool)
641665
}
642666

643-
d.FloatingIpPoolId = f
667+
d.FloatingIpPoolId = networkID
644668
log.Debug("Found floating IP pool id using its name", map[string]string{
645669
"Name": d.FloatingIpPool,
646670
"ID": d.FloatingIpPoolId,
647671
})
648672
}
649673

674+
if d.FloatingIpNetworkId == "" && !d.ComputeNetwork {
675+
d.FloatingIpNetworkId = strings.Split(d.NetworkId, ",")[0]
676+
log.Debug("Using first network as floating ip network")
677+
} else if d.FloatingIpNetworkName != "" && !d.ComputeNetwork {
678+
if err := d.initNetwork(); err != nil {
679+
return err
680+
}
681+
682+
networkID, err := d.client.GetNetworkIDs([]string{d.FloatingIpNetworkName})
683+
684+
if err != nil {
685+
return err
686+
}
687+
688+
d.FloatingIpNetworkId = networkID
689+
690+
log.Debug("Found floating network for floating ip using its name", map[string]string{
691+
"Name": d.FloatingIpNetworkName,
692+
"ID": d.FloatingIpNetworkId,
693+
})
694+
}
695+
650696
if d.TenantName != "" && d.TenantId == "" {
651697
if err := d.initIdentity(); err != nil {
652698
return err

‎drivers/openstack/openstack_test.go

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -77,15 +77,14 @@ func TestSetMultipleNetworkIds(t *testing.T) {
7777

7878
checkFlags := &drivers.CheckDriverOptions{
7979
FlagsValues: map[string]interface{}{
80-
"openstack-auth-url": "http://url",
81-
"openstack-username": "user",
82-
"openstack-password": "pwd",
83-
"openstack-tenant-id": "ID",
84-
"openstack-flavor-id": "ID",
85-
"openstack-image-id": "ID",
86-
//TODO: multivalue test
87-
//"openstack-net-id": "ID",
88-
"openstack-net-id": "ID2",
80+
"openstack-auth-url": "http://url",
81+
"openstack-username": "user",
82+
"openstack-password": "pwd",
83+
"openstack-tenant-id": "ID",
84+
"openstack-flavor-id": "ID",
85+
"openstack-image-id": "ID",
86+
"openstack-net-id": []string{"ID", "ID2"},
87+
"openstack-floatingip-net-id": "ID2",
8988
},
9089
CreateFlags: driver.GetCreateFlags(),
9190
}
@@ -101,15 +100,14 @@ func TestSetMultipleNetworkNames(t *testing.T) {
101100

102101
checkFlags := &drivers.CheckDriverOptions{
103102
FlagsValues: map[string]interface{}{
104-
"openstack-auth-url": "http://url",
105-
"openstack-username": "user",
106-
"openstack-password": "pwd",
107-
"openstack-tenant-id": "ID",
108-
"openstack-flavor-id": "ID",
109-
"openstack-image-id": "ID",
110-
"openstack-net-name": "ID",
111-
//TODO: multivalue test
112-
//"openstack-net-name": "ID2",
103+
"openstack-auth-url": "http://url",
104+
"openstack-username": "user",
105+
"openstack-password": "pwd",
106+
"openstack-tenant-id": "ID",
107+
"openstack-flavor-id": "ID",
108+
"openstack-image-id": "ID",
109+
"openstack-net-name": []string{"ID", "ID2"},
110+
"openstack-floatingip-net-name": "ID2",
113111
},
114112
CreateFlags: driver.GetCreateFlags(),
115113
}

0 commit comments

Comments
 (0)