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

Commit 12e700c

Browse files
committed
Initial implementation for backwards compatible multinic in openstack
Signed-off-by: Turo Soisenniemi <[email protected]>
1 parent b170508 commit 12e700c

File tree

4 files changed

+136
-26
lines changed

4 files changed

+136
-26
lines changed

.gitlab-ci.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ before_script:
2929
expire_in: 1 week
3030
tags:
3131
- docker
32-
- privileged
3332

3433
.build_validate: &build_validate
3534
<<: *build_base

drivers/openstack/client.go

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"fmt"
77
"io/ioutil"
88
"net/http"
9+
"strings"
910
"time"
1011

1112
"github.com/docker/machine/libmachine/log"
@@ -72,11 +73,12 @@ func (c *GenericClient) CreateInstance(d *Driver) (string, error) {
7273
Metadata: d.GetMetadata(),
7374
}
7475
if d.NetworkId != "" {
75-
serverOpts.Networks = []servers.Network{
76-
{
77-
UUID: d.NetworkId,
78-
},
76+
networkIDs := strings.Split(d.NetworkId, ",")
77+
networks := make([]servers.Network, len(networkIDs))
78+
for i, id := range networkIDs {
79+
networks[i] = servers.Network{UUID: id}
7980
}
81+
serverOpts.Networks = networks
8082
}
8183

8284
log.Info("Creating machine...")
@@ -212,10 +214,21 @@ func (c *GenericClient) GetFloatingIPPoolID(d *Driver) (string, error) {
212214
return c.getNetworkID(d, d.FloatingIpPool)
213215
}
214216

217+
func Contains(slice []string, element string) (bool, int) {
218+
for i, e := range slice {
219+
if e == element {
220+
return true, i
221+
}
222+
}
223+
return false, -1
224+
}
225+
215226
func (c *GenericClient) getNetworkID(d *Driver, networkName string) (string, error) {
216227
opts := networks.ListOpts{Name: networkName}
217228
pager := networks.List(c.Network, opts)
218-
networkID := ""
229+
networkNames := strings.Split(networkName, ",")
230+
remainingNetworks := len(networkNames)
231+
networkID := make([]string, remainingNetworks)
219232

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

226239
for _, n := range networkList {
227-
if n.Name == networkName {
228-
networkID = n.ID
229-
return false, nil
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+
}
230248
}
231249
}
232250

233251
return true, nil
234252
})
235253

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

239261
func (c *GenericClient) GetFlavorID(d *Driver) (string, error) {
@@ -454,7 +476,7 @@ func (c *GenericClient) getNeutronNetworkFloatingIPs(d *Driver) ([]FloatingIP, e
454476
func (c *GenericClient) GetInstancePortID(d *Driver) (string, error) {
455477
pager := ports.List(c.Network, ports.ListOpts{
456478
DeviceID: d.MachineId,
457-
NetworkID: d.NetworkId,
479+
NetworkID: strings.Split(d.NetworkId, ",")[0],
458480
})
459481

460482
var portID string

drivers/openstack/openstack.go

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -164,11 +164,11 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag {
164164
Usage: "OpenStack keypair to use to SSH to the instance",
165165
Value: "",
166166
},
167-
mcnflag.StringFlag{
167+
mcnflag.StringSliceFlag{
168168
EnvVar: "OS_NETWORK_ID",
169169
Name: "openstack-net-id",
170170
Usage: "OpenStack network id the machine will be connected on",
171-
Value: "",
171+
Value: []string{},
172172
},
173173
mcnflag.StringFlag{
174174
EnvVar: "OS_PRIVATE_KEY_FILE",
@@ -182,11 +182,11 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag {
182182
Usage: "File containing an openstack userdata script",
183183
Value: "",
184184
},
185-
mcnflag.StringFlag{
185+
mcnflag.StringSliceFlag{
186186
EnvVar: "OS_NETWORK_NAME",
187187
Name: "openstack-net-name",
188188
Usage: "OpenStack network name the machine will be connected on",
189-
Value: "",
189+
Value: []string{},
190190
},
191191
mcnflag.StringFlag{
192192
EnvVar: "OS_SECURITY_GROUPS",
@@ -202,7 +202,7 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag {
202202
mcnflag.StringFlag{
203203
EnvVar: "OS_FLOATINGIP_POOL",
204204
Name: "openstack-floatingip-pool",
205-
Usage: "OpenStack floating IP pool to get an IP from to assign to the instance",
205+
Usage: "OpenStack floating IP pool to get an IP from to assign to the instance (first network only)",
206206
Value: "",
207207
},
208208
mcnflag.IntFlag{
@@ -291,8 +291,8 @@ func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error {
291291
d.FlavorName = flags.String("openstack-flavor-name")
292292
d.ImageId = flags.String("openstack-image-id")
293293
d.ImageName = flags.String("openstack-image-name")
294-
d.NetworkId = flags.String("openstack-net-id")
295-
d.NetworkName = flags.String("openstack-net-name")
294+
d.NetworkId = strings.Join(flags.StringSlice("openstack-net-id"), ",")
295+
d.NetworkName = strings.Join(flags.StringSlice("openstack-net-name"), ",")
296296
d.metadata = flags.String("openstack-metadata")
297297
if flags.String("openstack-sec-groups") != "" {
298298
d.SecurityGroups = strings.Split(flags.String("openstack-sec-groups"), ",")
@@ -553,7 +553,7 @@ func (d *Driver) checkConfig() error {
553553
}
554554

555555
if d.NetworkName != "" && d.NetworkId != "" {
556-
return fmt.Errorf(errorExclusiveOptions, "Network name", "Network id")
556+
return fmt.Errorf(errorExclusiveOptions, "Network names", "Network ids")
557557
}
558558
if d.EndpointType != "" && (d.EndpointType != "publicURL" && d.EndpointType != "adminURL" && d.EndpointType != "internalURL") {
559559
return fmt.Errorf(errorWrongEndpointType)
@@ -570,21 +570,18 @@ func (d *Driver) resolveIds() error {
570570
return err
571571
}
572572

573-
networkID, err := d.client.GetNetworkID(d)
573+
networkIDs, err := d.client.GetNetworkID(d)
574574

575575
if err != nil {
576576
return err
577577
}
578578

579-
if networkID == "" {
579+
if networkIDs == "" {
580580
return fmt.Errorf(errorUnknownNetworkName, d.NetworkName)
581581
}
582582

583-
d.NetworkId = networkID
584-
log.Debug("Found network id using its name", map[string]string{
585-
"Name": d.NetworkName,
586-
"ID": d.NetworkId,
587-
})
583+
d.NetworkId = networkIDs
584+
//TODO: log found networks?
588585
}
589586

590587
if d.FlavorName != "" {

drivers/openstack/openstack_test.go

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,95 @@ func TestSetConfigFromFlags(t *testing.T) {
2727
assert.NoError(t, err)
2828
assert.Empty(t, checkFlags.InvalidFlags)
2929
}
30+
31+
func TestSetSingleNetworkId(t *testing.T) {
32+
driver := NewDriver("default", "path")
33+
34+
checkFlags := &drivers.CheckDriverOptions{
35+
FlagsValues: map[string]interface{}{
36+
"openstack-auth-url": "http://url",
37+
"openstack-username": "user",
38+
"openstack-password": "pwd",
39+
"openstack-tenant-id": "ID",
40+
"openstack-flavor-id": "ID",
41+
"openstack-image-id": "ID",
42+
"openstack-net-id": "ID",
43+
},
44+
CreateFlags: driver.GetCreateFlags(),
45+
}
46+
47+
err := driver.SetConfigFromFlags(checkFlags)
48+
49+
assert.NoError(t, err)
50+
assert.Empty(t, checkFlags.InvalidFlags)
51+
}
52+
53+
func TestSetSingleNetworkName(t *testing.T) {
54+
driver := NewDriver("default", "path")
55+
56+
checkFlags := &drivers.CheckDriverOptions{
57+
FlagsValues: map[string]interface{}{
58+
"openstack-auth-url": "http://url",
59+
"openstack-username": "user",
60+
"openstack-password": "pwd",
61+
"openstack-tenant-id": "ID",
62+
"openstack-flavor-id": "ID",
63+
"openstack-image-id": "ID",
64+
"openstack-net-name": "ID",
65+
},
66+
CreateFlags: driver.GetCreateFlags(),
67+
}
68+
69+
err := driver.SetConfigFromFlags(checkFlags)
70+
71+
assert.NoError(t, err)
72+
assert.Empty(t, checkFlags.InvalidFlags)
73+
}
74+
75+
func TestSetMultipleNetworkIds(t *testing.T) {
76+
driver := NewDriver("default", "path")
77+
78+
checkFlags := &drivers.CheckDriverOptions{
79+
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",
89+
},
90+
CreateFlags: driver.GetCreateFlags(),
91+
}
92+
93+
err := driver.SetConfigFromFlags(checkFlags)
94+
95+
assert.NoError(t, err)
96+
assert.Empty(t, checkFlags.InvalidFlags)
97+
}
98+
99+
func TestSetMultipleNetworkNames(t *testing.T) {
100+
driver := NewDriver("default", "path")
101+
102+
checkFlags := &drivers.CheckDriverOptions{
103+
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",
113+
},
114+
CreateFlags: driver.GetCreateFlags(),
115+
}
116+
117+
err := driver.SetConfigFromFlags(checkFlags)
118+
119+
assert.NoError(t, err)
120+
assert.Empty(t, checkFlags.InvalidFlags)
121+
}

0 commit comments

Comments
 (0)