Skip to content

Commit e6ea45b

Browse files
author
Dean Troyer
committed
Low-level Compute v2 API: floating ip
api.compute.APIv2 floating ip functions. novaclient 8.0 is now released without support for the previously deprecated nova-net functions, so include a new low-level REST implementation of the removed APIs. Change-Id: Ic461b8d15e072e0534dcd73fff6857581d83c89b
1 parent 4289ddd commit e6ea45b

5 files changed

Lines changed: 277 additions & 93 deletions

File tree

openstackclient/api/compute_v2.py

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,88 @@ def find(
6464

6565
return ret
6666

67+
# Flaoting IPs
68+
69+
def floating_ip_create(
70+
self,
71+
pool=None,
72+
):
73+
"""Create a new floating ip
74+
75+
https://developer.openstack.org/api-ref/compute/#create-allocate-floating-ip-address
76+
77+
:param pool: Name of floating IP pool
78+
"""
79+
80+
url = "/os-floating-ips"
81+
82+
try:
83+
return self.create(
84+
url,
85+
json={'pool': pool},
86+
)['floating_ip']
87+
except (
88+
ksa_exceptions.NotFound,
89+
ksa_exceptions.BadRequest,
90+
):
91+
msg = _("%s not found") % pool
92+
raise exceptions.NotFound(msg)
93+
94+
def floating_ip_delete(
95+
self,
96+
floating_ip_id=None,
97+
):
98+
"""Delete a floating IP
99+
100+
https://developer.openstack.org/api-ref/compute/#delete-deallocate-floating-ip-address
101+
102+
:param string security_group:
103+
Floating IP ID
104+
"""
105+
106+
url = "/os-floating-ips"
107+
108+
if floating_ip_id is not None:
109+
return self.delete('/%s/%s' % (url, floating_ip_id))
110+
111+
return None
112+
113+
def floating_ip_find(
114+
self,
115+
floating_ip=None,
116+
):
117+
"""Return a security group given name or ID
118+
119+
https://developer.openstack.org/api-ref/compute/#list-floating-ip-addresses
120+
121+
:param string floating_ip:
122+
Floating IP address
123+
:returns: A dict of the floating IP attributes
124+
"""
125+
126+
url = "/os-floating-ips"
127+
128+
return self.find(
129+
url,
130+
attr='ip',
131+
value=floating_ip,
132+
)
133+
134+
def floating_ip_list(
135+
self,
136+
):
137+
"""Get floating IPs
138+
139+
https://developer.openstack.org/api-ref/compute/#show-floating-ip-address-details
140+
141+
:returns:
142+
list of security groups names
143+
"""
144+
145+
url = "/os-floating-ips"
146+
147+
return self.list(url)["floating_ips"]
148+
67149
# Security Groups
68150

69151
def security_group_create(

openstackclient/network/v2/floating_ip.py

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -190,9 +190,9 @@ def take_action_network(self, client, parsed_args):
190190
return (display_columns, data)
191191

192192
def take_action_compute(self, client, parsed_args):
193-
obj = client.floating_ips.create(parsed_args.network)
194-
columns = _get_columns(obj._info)
195-
data = utils.get_dict_properties(obj._info, columns)
193+
obj = client.api.floating_ip_create(parsed_args.network)
194+
columns = _get_columns(obj)
195+
data = utils.get_dict_properties(obj, columns)
196196
return (columns, data)
197197

198198

@@ -245,13 +245,7 @@ def take_action_network(self, client, parsed_args):
245245
client.delete_ip(obj)
246246

247247
def take_action_compute(self, client, parsed_args):
248-
obj = utils.find_resource(client.floating_ips, self.r)
249-
client.floating_ips.delete(obj.id)
250-
251-
def take_action(self, parsed_args):
252-
"""Implements a naive cache for the list of floating IPs"""
253-
254-
super(DeleteFloatingIP, self).take_action(parsed_args)
248+
client.api.floating_ip_delete(self.r)
255249

256250

257251
class DeleteIPFloating(DeleteFloatingIP):
@@ -414,10 +408,10 @@ def take_action_compute(self, client, parsed_args):
414408
'Pool',
415409
)
416410

417-
data = client.floating_ips.list()
411+
data = client.api.floating_ip_list()
418412

419413
return (headers,
420-
(utils.get_item_properties(
414+
(utils.get_dict_properties(
421415
s, columns,
422416
formatters={},
423417
) for s in data))
@@ -510,12 +504,9 @@ def take_action_network(self, client, parsed_args):
510504
return (display_columns, data)
511505

512506
def take_action_compute(self, client, parsed_args):
513-
obj = utils.find_resource(
514-
client.floating_ips,
515-
parsed_args.floating_ip,
516-
)
517-
columns = _get_columns(obj._info)
518-
data = utils.get_dict_properties(obj._info, columns)
507+
obj = client.api.floating_ip_find(parsed_args.floating_ip)
508+
columns = _get_columns(obj)
509+
data = utils.get_dict_properties(obj, columns)
519510
return (columns, data)
520511

521512

openstackclient/tests/unit/api/test_compute_v2.py

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,117 @@ def setUp(self):
3434
self.requests_mock = self.useFixture(fixture.Fixture())
3535

3636

37+
class TestFloatingIP(TestComputeAPIv2):
38+
39+
FAKE_FLOATING_IP_RESP = {
40+
'id': 1,
41+
'ip': '203.0.113.11', # TEST-NET-3
42+
'fixed_ip': '198.51.100.11', # TEST-NET-2
43+
'pool': 'nova',
44+
'instance_id': None,
45+
}
46+
FAKE_FLOATING_IP_RESP_2 = {
47+
'id': 2,
48+
'ip': '203.0.113.12', # TEST-NET-3
49+
'fixed_ip': '198.51.100.12', # TEST-NET-2
50+
'pool': 'nova',
51+
'instance_id': None,
52+
}
53+
LIST_FLOATING_IP_RESP = [
54+
FAKE_FLOATING_IP_RESP,
55+
FAKE_FLOATING_IP_RESP_2,
56+
]
57+
58+
def test_floating_ip_create(self):
59+
self.requests_mock.register_uri(
60+
'POST',
61+
FAKE_URL + '/os-floating-ips',
62+
json={'floating_ip': self.FAKE_FLOATING_IP_RESP},
63+
status_code=200,
64+
)
65+
ret = self.api.floating_ip_create('nova')
66+
self.assertEqual(self.FAKE_FLOATING_IP_RESP, ret)
67+
68+
def test_floating_ip_create_not_found(self):
69+
self.requests_mock.register_uri(
70+
'POST',
71+
FAKE_URL + '/os-floating-ips',
72+
status_code=404,
73+
)
74+
self.assertRaises(
75+
osc_lib_exceptions.NotFound,
76+
self.api.floating_ip_create,
77+
'not-nova',
78+
)
79+
80+
def test_floating_ip_delete(self):
81+
self.requests_mock.register_uri(
82+
'DELETE',
83+
FAKE_URL + '/os-floating-ips/1',
84+
status_code=202,
85+
)
86+
ret = self.api.floating_ip_delete('1')
87+
self.assertEqual(202, ret.status_code)
88+
self.assertEqual("", ret.text)
89+
90+
def test_floating_ip_delete_none(self):
91+
ret = self.api.floating_ip_delete()
92+
self.assertIsNone(ret)
93+
94+
def test_floating_ip_find_id(self):
95+
self.requests_mock.register_uri(
96+
'GET',
97+
FAKE_URL + '/os-floating-ips/1',
98+
json={'floating_ip': self.FAKE_FLOATING_IP_RESP},
99+
status_code=200,
100+
)
101+
ret = self.api.floating_ip_find('1')
102+
self.assertEqual(self.FAKE_FLOATING_IP_RESP, ret)
103+
104+
def test_floating_ip_find_ip(self):
105+
self.requests_mock.register_uri(
106+
'GET',
107+
FAKE_URL + '/os-floating-ips/' + self.FAKE_FLOATING_IP_RESP['ip'],
108+
status_code=404,
109+
)
110+
self.requests_mock.register_uri(
111+
'GET',
112+
FAKE_URL + '/os-floating-ips',
113+
json={'floating_ips': self.LIST_FLOATING_IP_RESP},
114+
status_code=200,
115+
)
116+
ret = self.api.floating_ip_find(self.FAKE_FLOATING_IP_RESP['ip'])
117+
self.assertEqual(self.FAKE_FLOATING_IP_RESP, ret)
118+
119+
def test_floating_ip_find_not_found(self):
120+
self.requests_mock.register_uri(
121+
'GET',
122+
FAKE_URL + '/os-floating-ips/1.2.3.4',
123+
status_code=404,
124+
)
125+
self.requests_mock.register_uri(
126+
'GET',
127+
FAKE_URL + '/os-floating-ips',
128+
json={'floating_ips': self.LIST_FLOATING_IP_RESP},
129+
status_code=200,
130+
)
131+
self.assertRaises(
132+
osc_lib_exceptions.NotFound,
133+
self.api.floating_ip_find,
134+
'1.2.3.4',
135+
)
136+
137+
def test_floating_ip_list(self):
138+
self.requests_mock.register_uri(
139+
'GET',
140+
FAKE_URL + '/os-floating-ips',
141+
json={'floating_ips': self.LIST_FLOATING_IP_RESP},
142+
status_code=200,
143+
)
144+
ret = self.api.floating_ip_list()
145+
self.assertEqual(self.LIST_FLOATING_IP_RESP, ret)
146+
147+
37148
class TestSecurityGroup(TestComputeAPIv2):
38149

39150
FAKE_SECURITY_GROUP_RESP = {

openstackclient/tests/unit/compute/v2/fakes.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1019,11 +1019,7 @@ def create_one_floating_ip(attrs=None):
10191019
# Overwrite default attributes.
10201020
floating_ip_attrs.update(attrs)
10211021

1022-
floating_ip = fakes.FakeResource(
1023-
info=copy.deepcopy(floating_ip_attrs),
1024-
loaded=True)
1025-
1026-
return floating_ip
1022+
return floating_ip_attrs
10271023

10281024
@staticmethod
10291025
def create_floating_ips(attrs=None, count=2):

0 commit comments

Comments
 (0)