@@ -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
5861const (
@@ -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
0 commit comments