Filter openstack floating IPs by tenant ID

Merge j2sol:filter-openstack-floating and fix up for comments in PR #1809.

Signed-off-by: Matt Vinall <matt.vinall@imgtec.com>
This commit is contained in:
Matt Vinall 2015-12-15 22:30:49 +00:00
parent a3eb02897c
commit 2f482ac085
2 changed files with 74 additions and 0 deletions

View File

@ -17,6 +17,7 @@ import (
"github.com/rackspace/gophercloud/openstack/compute/v2/flavors"
"github.com/rackspace/gophercloud/openstack/compute/v2/images"
"github.com/rackspace/gophercloud/openstack/compute/v2/servers"
"github.com/rackspace/gophercloud/openstack/identity/v2/tenants"
"github.com/rackspace/gophercloud/openstack/networking/v2/extensions/layer3/floatingips"
"github.com/rackspace/gophercloud/openstack/networking/v2/networks"
"github.com/rackspace/gophercloud/openstack/networking/v2/ports"
@ -26,6 +27,7 @@ import (
type Client interface {
Authenticate(d *Driver) error
InitComputeClient(d *Driver) error
InitIdentityClient(d *Driver) error
InitNetworkClient(d *Driver) error
CreateInstance(d *Driver) (string, error)
@ -45,11 +47,13 @@ type Client interface {
GetFloatingIPs(d *Driver) ([]FloatingIP, error)
GetFloatingIPPoolID(d *Driver) (string, error)
GetInstancePortID(d *Driver) (string, error)
GetTenantID(d *Driver) (string, error)
}
type GenericClient struct {
Provider *gophercloud.ProviderClient
Compute *gophercloud.ServiceClient
Identity *gophercloud.ServiceClient
Network *gophercloud.ServiceClient
}
@ -273,6 +277,29 @@ func (c *GenericClient) GetImageID(d *Driver) (string, error) {
return imageID, err
}
func (c *GenericClient) GetTenantID(d *Driver) (string, error) {
pager := tenants.List(c.Identity, nil)
tenantId := ""
err := pager.EachPage(func(page pagination.Page) (bool, error) {
tenantList, err := tenants.ExtractTenants(page)
if err != nil {
return false, err
}
for _, i := range tenantList {
if i.Name == d.TenantName {
tenantId = i.ID
return false, nil
}
}
return true, nil
})
return tenantId, err
}
func (c *GenericClient) CreateKeyPair(d *Driver, name string, publicKey string) error {
opts := keypairs.CreateOpts{
Name: name,
@ -378,8 +405,13 @@ func (c *GenericClient) getNovaNetworkFloatingIPs(d *Driver) ([]FloatingIP, erro
}
func (c *GenericClient) getNeutronNetworkFloatingIPs(d *Driver) ([]FloatingIP, error) {
log.Debug("Listing floating IPs", map[string]string{
"FloatingNetworkId": d.FloatingIpPoolId,
"TenantID": d.TenantId,
})
pager := floatingips.List(c.Network, floatingips.ListOpts{
FloatingNetworkID: d.FloatingIpPoolId,
TenantID: d.TenantId,
})
ips := []FloatingIP{}
@ -446,6 +478,16 @@ func (c *GenericClient) InitComputeClient(d *Driver) error {
return nil
}
func (c *GenericClient) InitIdentityClient(d *Driver) error {
if c.Identity != nil {
return nil
}
identity := openstack.NewIdentityV2(c.Provider)
c.Identity = identity
return nil
}
func (c *GenericClient) InitNetworkClient(d *Driver) error {
if c.Network != nil {
return nil

View File

@ -427,6 +427,7 @@ const (
errorUnknownFlavorName string = "Unable to find flavor named %s"
errorUnknownImageName string = "Unable to find image named %s"
errorUnknownNetworkName string = "Unable to find network named %s"
errorUnknownTenantName string = "Unable to find tenant named %s"
)
func (d *Driver) checkConfig() error {
@ -552,6 +553,27 @@ func (d *Driver) resolveIds() error {
})
}
if d.TenantId == "" {
if err := d.initIdentity(); err != nil {
return err
}
tenantId, err := d.client.GetTenantID(d)
if err != nil {
return err
}
if tenantId == "" {
return fmt.Errorf(errorUnknownTenantName, d.TenantName)
}
d.TenantId = tenantId
log.Debug("Found tenant id using its name", map[string]string{
"Name": d.TenantName,
"ID": d.TenantId,
})
}
return nil
}
@ -565,6 +587,16 @@ func (d *Driver) initCompute() error {
return nil
}
func (d *Driver) initIdentity() error {
if err := d.client.Authenticate(d); err != nil {
return err
}
if err := d.client.InitIdentityClient(d); err != nil {
return err
}
return nil
}
func (d *Driver) initNetwork() error {
if err := d.client.Authenticate(d); err != nil {
return err