Implementing Floating Ip Pools.
See vishy's nova branch: https://review.openstack.org/#change,2892 Change-Id: I6a5bec55edd21f659674f478282e65fd6b1b0b1e
This commit is contained in:
parent
c747f153ec
commit
d7fb1f33cc
@ -88,6 +88,8 @@ You'll find complete documentation on the shell by running
|
|||||||
floating-ip-create Allocate a floating IP to the current tenant.
|
floating-ip-create Allocate a floating IP to the current tenant.
|
||||||
floating-ip-delete De-allocate a floating IP from the current tenant.
|
floating-ip-delete De-allocate a floating IP from the current tenant.
|
||||||
floating-ip-list List allocated floating IPs for the current tenant.
|
floating-ip-list List allocated floating IPs for the current tenant.
|
||||||
|
floating-ip-pool-list
|
||||||
|
List all floating ip pools.
|
||||||
help Display help about this program or one of its
|
help Display help about this program or one of its
|
||||||
subcommands.
|
subcommands.
|
||||||
image-create Create a new image by taking a snapshot of a running
|
image-create Create a new image by taking a snapshot of a running
|
||||||
|
@ -2,6 +2,7 @@ from novaclient import client
|
|||||||
from novaclient.v1_1 import flavors
|
from novaclient.v1_1 import flavors
|
||||||
from novaclient.v1_1 import floating_ip_dns
|
from novaclient.v1_1 import floating_ip_dns
|
||||||
from novaclient.v1_1 import floating_ips
|
from novaclient.v1_1 import floating_ips
|
||||||
|
from novaclient.v1_1 import floating_ip_pools
|
||||||
from novaclient.v1_1 import images
|
from novaclient.v1_1 import images
|
||||||
from novaclient.v1_1 import keypairs
|
from novaclient.v1_1 import keypairs
|
||||||
from novaclient.v1_1 import limits
|
from novaclient.v1_1 import limits
|
||||||
@ -46,6 +47,7 @@ class Client(object):
|
|||||||
# extensions
|
# extensions
|
||||||
self.floating_ips = floating_ips.FloatingIPManager(self)
|
self.floating_ips = floating_ips.FloatingIPManager(self)
|
||||||
self.floating_ip_dns = floating_ip_dns.FloatingIPDNSManager(self)
|
self.floating_ip_dns = floating_ip_dns.FloatingIPDNSManager(self)
|
||||||
|
self.floating_ip_pools = floating_ip_pools.FloatingIPPoolManager(self)
|
||||||
self.volumes = volumes.VolumeManager(self)
|
self.volumes = volumes.VolumeManager(self)
|
||||||
self.volume_snapshots = volume_snapshots.SnapshotManager(self)
|
self.volume_snapshots = volume_snapshots.SnapshotManager(self)
|
||||||
self.keypairs = keypairs.KeypairManager(self)
|
self.keypairs = keypairs.KeypairManager(self)
|
||||||
|
34
novaclient/v1_1/floating_ip_pools.py
Normal file
34
novaclient/v1_1/floating_ip_pools.py
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
# Copyright (c) 2011 X.commerce, a business unit of eBay Inc.
|
||||||
|
#
|
||||||
|
# All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
import urllib
|
||||||
|
|
||||||
|
from novaclient import base
|
||||||
|
|
||||||
|
|
||||||
|
class FloatingIPPool(base.Resource):
|
||||||
|
def __repr__(self):
|
||||||
|
return "<FloatingIPPool: name=%s>" % self.name
|
||||||
|
|
||||||
|
|
||||||
|
class FloatingIPPoolManager(base.ManagerWithFind):
|
||||||
|
resource_class = FloatingIPPool
|
||||||
|
|
||||||
|
def list(self):
|
||||||
|
"""
|
||||||
|
Retrieve a list of all floating ip pools.
|
||||||
|
"""
|
||||||
|
return self._list('/os-floating-ip-pools', 'floating_ip_pools')
|
@ -1,3 +1,4 @@
|
|||||||
|
# Copyright (c) 2011 X.commerce, a business unit of eBay Inc.
|
||||||
# Copyright 2011 OpenStack LLC.
|
# Copyright 2011 OpenStack LLC.
|
||||||
# All Rights Reserved.
|
# All Rights Reserved.
|
||||||
#
|
#
|
||||||
@ -33,11 +34,11 @@ class FloatingIPManager(base.ManagerWithFind):
|
|||||||
"""
|
"""
|
||||||
return self._list("/os-floating-ips", "floating_ips")
|
return self._list("/os-floating-ips", "floating_ips")
|
||||||
|
|
||||||
def create(self):
|
def create(self, pool=None):
|
||||||
"""
|
"""
|
||||||
Create (allocate) a floating ip for a tenant
|
Create (allocate) a floating ip for a tenant
|
||||||
"""
|
"""
|
||||||
return self._create("/os-floating-ips", {}, "floating_ip")
|
return self._create("/os-floating-ips", {'pool': pool}, "floating_ip")
|
||||||
|
|
||||||
def delete(self, floating_ip):
|
def delete(self, floating_ip):
|
||||||
"""
|
"""
|
||||||
|
@ -963,7 +963,7 @@ def do_volume_snapshot_delete(cs, args):
|
|||||||
|
|
||||||
|
|
||||||
def _print_floating_ip_list(floating_ips):
|
def _print_floating_ip_list(floating_ips):
|
||||||
utils.print_list(floating_ips, ['Ip', 'Instance Id', 'Fixed Ip'])
|
utils.print_list(floating_ips, ['Ip', 'Instance Id', 'Fixed Ip', 'Pool'])
|
||||||
|
|
||||||
|
|
||||||
@utils.arg('server', metavar='<server>', help='Name or ID of server.')
|
@utils.arg('server', metavar='<server>', help='Name or ID of server.')
|
||||||
@ -982,9 +982,14 @@ def do_remove_floating_ip(cs, args):
|
|||||||
server.remove_floating_ip(args.address)
|
server.remove_floating_ip(args.address)
|
||||||
|
|
||||||
|
|
||||||
|
@utils.arg('pool',
|
||||||
|
metavar='<floating_ip_pool>',
|
||||||
|
help='Name of Floating IP Pool. (Optional)',
|
||||||
|
nargs='?',
|
||||||
|
default=None)
|
||||||
def do_floating_ip_create(cs, args):
|
def do_floating_ip_create(cs, args):
|
||||||
"""Allocate a floating IP for the current tenant."""
|
"""Allocate a floating IP for the current tenant."""
|
||||||
_print_floating_ip_list([cs.floating_ips.create()])
|
_print_floating_ip_list([cs.floating_ips.create(pool=args.pool)])
|
||||||
|
|
||||||
|
|
||||||
@utils.arg('address', metavar='<address>', help='IP of Floating Ip.')
|
@utils.arg('address', metavar='<address>', help='IP of Floating Ip.')
|
||||||
@ -1002,6 +1007,11 @@ def do_floating_ip_list(cs, args):
|
|||||||
_print_floating_ip_list(cs.floating_ips.list())
|
_print_floating_ip_list(cs.floating_ips.list())
|
||||||
|
|
||||||
|
|
||||||
|
def do_floating_ip_pool_list(cs, args):
|
||||||
|
"""List all floating ip pools."""
|
||||||
|
utils.print_list(cs.floating_ip_pools.list(), ['name'])
|
||||||
|
|
||||||
|
|
||||||
def _print_dns_list(dns_entries):
|
def _print_dns_list(dns_entries):
|
||||||
utils.print_list(dns_entries, ['ip', 'zone', 'name'])
|
utils.print_list(dns_entries, ['ip', 'zone', 'name'])
|
||||||
|
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
# Copyright (c) 2011 X.commerce, a business unit of eBay Inc.
|
||||||
# Copyright 2011 OpenStack, LLC
|
# Copyright 2011 OpenStack, LLC
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -352,6 +353,9 @@ class FakeHTTPClient(base_client.HTTPClient):
|
|||||||
# Floating ips
|
# Floating ips
|
||||||
#
|
#
|
||||||
|
|
||||||
|
def get_os_floating_ip_pools(self):
|
||||||
|
return (200, {'floating_ip_pools': [{'name': 'foo', 'name': 'bar'}]})
|
||||||
|
|
||||||
def get_os_floating_ips(self, **kw):
|
def get_os_floating_ips(self, **kw):
|
||||||
return (200, {'floating_ips': [
|
return (200, {'floating_ips': [
|
||||||
{'id': 1, 'fixed_ip': '10.0.0.1', 'ip': '11.0.0.1'},
|
{'id': 1, 'fixed_ip': '10.0.0.1', 'ip': '11.0.0.1'},
|
||||||
@ -366,6 +370,16 @@ class FakeHTTPClient(base_client.HTTPClient):
|
|||||||
def post_os_floating_ips(self, body, **kw):
|
def post_os_floating_ips(self, body, **kw):
|
||||||
return (202, self.get_os_floating_ips_1()[1])
|
return (202, self.get_os_floating_ips_1()[1])
|
||||||
|
|
||||||
|
def post_os_floating_ips(self, body):
|
||||||
|
if body.get('pool'):
|
||||||
|
return (200, {'floating_ip':
|
||||||
|
{'id': 1, 'fixed_ip': '10.0.0.1', 'ip': '11.0.0.1',
|
||||||
|
'pool': 'nova'}})
|
||||||
|
else:
|
||||||
|
return (200, {'floating_ip':
|
||||||
|
{'id': 1, 'fixed_ip': '10.0.0.1', 'ip': '11.0.0.1',
|
||||||
|
'pool': None}})
|
||||||
|
|
||||||
def delete_os_floating_ips_1(self, **kw):
|
def delete_os_floating_ips_1(self, **kw):
|
||||||
return (204, None)
|
return (204, None)
|
||||||
|
|
||||||
|
31
tests/v1_1/test_floating_ip_pools.py
Normal file
31
tests/v1_1/test_floating_ip_pools.py
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
# Copyright (c) 2011 X.commerce, a business unit of eBay Inc.
|
||||||
|
#
|
||||||
|
# All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from novaclient.v1_1 import floating_ip_pools
|
||||||
|
from tests import utils
|
||||||
|
from tests.v1_1 import fakes
|
||||||
|
|
||||||
|
|
||||||
|
cs = fakes.FakeClient()
|
||||||
|
|
||||||
|
|
||||||
|
class TestFloatingIPPools(utils.TestCase):
|
||||||
|
|
||||||
|
def test_list_floating_ips(self):
|
||||||
|
fl = cs.floating_ip_pools.list()
|
||||||
|
cs.assert_called('GET', '/os-floating-ip-pools')
|
||||||
|
[self.assertTrue(isinstance(f, floating_ip_pools.FloatingIPPool))
|
||||||
|
for f in fl]
|
@ -1,3 +1,19 @@
|
|||||||
|
# Copyright (c) 2011 X.commerce, a business unit of eBay Inc.
|
||||||
|
#
|
||||||
|
# All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
from novaclient.v1_1 import floating_ips
|
from novaclient.v1_1 import floating_ips
|
||||||
from tests import utils
|
from tests import utils
|
||||||
from tests.v1_1 import fakes
|
from tests.v1_1 import fakes
|
||||||
@ -25,4 +41,11 @@ class FloatingIPsTest(utils.TestCase):
|
|||||||
def test_create_floating_ip(self):
|
def test_create_floating_ip(self):
|
||||||
fl = cs.floating_ips.create()
|
fl = cs.floating_ips.create()
|
||||||
cs.assert_called('POST', '/os-floating-ips')
|
cs.assert_called('POST', '/os-floating-ips')
|
||||||
|
self.assertEqual(fl.pool, None)
|
||||||
|
self.assertTrue(isinstance(fl, floating_ips.FloatingIP))
|
||||||
|
|
||||||
|
def test_create_floating_ip_with_pool(self):
|
||||||
|
fl = cs.floating_ips.create('foo')
|
||||||
|
cs.assert_called('POST', '/os-floating-ips')
|
||||||
|
self.assertEqual(fl.pool, 'nova')
|
||||||
self.assertTrue(isinstance(fl, floating_ips.FloatingIP))
|
self.assertTrue(isinstance(fl, floating_ips.FloatingIP))
|
||||||
|
Loading…
Reference in New Issue
Block a user