Port ips-extended to API-v3 ips core API Part 2

This includes on ips responses extended ip information: mac address and type,
adds V3 version of the views and the tests to also test this information, which
affects servers and ips core API.

related to bp nova-v3-api

Change-Id: I699f6e27b53663f358b63615e7dd0f1627c4730b
This commit is contained in:
Mauro S. M. Rodrigues
2013-07-18 13:53:01 -04:00
parent d74c09f4e8
commit 310105016c
7 changed files with 184 additions and 59 deletions

View File

@@ -19,7 +19,7 @@ from webob import exc
import nova
from nova.api.openstack import common
from nova.api.openstack.compute.views import addresses as view_addresses
from nova.api.openstack.compute.views import addresses as views_addresses
from nova.api.openstack import extensions
from nova.api.openstack import wsgi
from nova.api.openstack import xmlutil
@@ -31,7 +31,8 @@ def make_network(elem):
ip = xmlutil.SubTemplateElement(elem, 'ip', selector=1)
ip.set('version')
ip.set('addr')
ip.set('type')
ip.set('mac_addr')
network_nsmap = {None: xmlutil.XMLNS_V11}
@@ -56,7 +57,7 @@ class AddressesTemplate(xmlutil.TemplateBuilder):
class IPsController(wsgi.Controller):
"""The servers addresses API controller for the OpenStack API."""
_view_builder_class = view_addresses.ViewBuilder
_view_builder_class = views_addresses.ViewBuilderV3
def __init__(self, **kwargs):
super(IPsController, self).__init__(**kwargs)

View File

@@ -24,7 +24,7 @@ import webob
from webob import exc
from nova.api.openstack import common
from nova.api.openstack.compute import ips
from nova.api.openstack.compute.plugins.v3 import ips
from nova.api.openstack.compute.views import servers as views_servers
from nova.api.openstack import extensions
from nova.api.openstack import wsgi
@@ -436,7 +436,7 @@ class ServersController(wsgi.Controller):
EXTENSION_CREATE_NAMESPACE = 'nova.api.v3.extensions.server.create'
EXTENSION_DESERIALIZE_EXTRACT_SERVER_NAMESPACE = (
'nova.api.v3.extensions.server.create.deserialize')
_view_builder_class = views_servers.ViewBuilder
_view_builder_class = views_servers.ViewBuilderV3
@staticmethod
def _add_location(robj):

View File

@@ -7,6 +7,8 @@
<element name="ip">
<attribute name="version"> <text/> </attribute>
<attribute name="addr"> <text/> </attribute>
<attribute name="type"> <text/> </attribute>
<attribute name="mac_addr"> <text/> </attribute>
</element>
</zeroOrMore>
</element>

View File

@@ -40,19 +40,9 @@
</element>
</zeroOrMore>
</element>
<element name="addresses">
<zeroOrMore>
<element name="network">
<attribute name="id"> <text/> </attribute>
<zeroOrMore>
<element name="ip">
<attribute name="version"> <text/> </attribute>
<attribute name="addr"> <text/> </attribute>
</element>
</zeroOrMore>
</element>
</zeroOrMore>
</element>
<oneOrMore>
<externalRef href="addresses.rng"/>
</oneOrMore>
<zeroOrMore>
<externalRef href="../atom-link.rng"/>
</zeroOrMore>

View File

@@ -44,3 +44,15 @@ class ViewBuilder(common.ViewBuilder):
network_dict = self.show(network, label)
addresses[label] = network_dict[label]
return dict(addresses=addresses)
class ViewBuilderV3(ViewBuilder):
"""Models server addresses as a dictionary."""
def basic(self, ip):
"""Return a dictionary describing an IP address."""
return {
"version": ip["version"],
"addr": ip["address"],
"type": ip["type"],
"mac_addr": ip['mac_address'],
}

View File

@@ -218,3 +218,11 @@ class ViewBuilder(common.ViewBuilder):
fault_dict['details'] = fault["details"]
return fault_dict
class ViewBuilderV3(ViewBuilder):
def __init__(self):
"""Initialize view builder."""
super(ViewBuilderV3, self).__init__()
self._address_builder = views_addresses.ViewBuilderV3()

View File

@@ -308,8 +308,10 @@ class ServersControllerTest(test.TestCase):
},
"addresses": {
'test1': [
{'version': 4, 'addr': '192.168.1.100'},
{'version': 6, 'addr': '2001:db8:0:1::1'}
{'version': 4, 'addr': '192.168.1.100',
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'},
{'version': 6, 'addr': '2001:db8:0:1::1',
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'}
]
},
"metadata": {
@@ -374,8 +376,10 @@ class ServersControllerTest(test.TestCase):
},
"addresses": {
'test1': [
{'version': 4, 'addr': '192.168.1.100'},
{'version': 6, 'addr': '2001:db8:0:1::1'}
{'version': 4, 'addr': '192.168.1.100',
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'},
{'version': 6, 'addr': '2001:db8:0:1::1',
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'},
]
},
"metadata": {
@@ -443,8 +447,10 @@ class ServersControllerTest(test.TestCase):
},
"addresses": {
'test1': [
{'version': 4, 'addr': '192.168.1.100'},
{'version': 6, 'addr': '2001:db8:0:1::1'}
{'version': 4, 'addr': '192.168.1.100',
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'},
{'version': 6, 'addr': '2001:db8:0:1::1',
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'},
]
},
"metadata": {
@@ -503,14 +509,20 @@ class ServersControllerTest(test.TestCase):
expected = {
'addresses': {
'private': [
{'version': 4, 'addr': '192.168.0.3'},
{'version': 4, 'addr': '192.168.0.4'},
{'version': 4, 'addr': '192.168.0.3',
'type': 'fixed', 'mac_addr': 'bb:bb:bb:bb:bb:bb'},
{'version': 4, 'addr': '192.168.0.4',
'type': 'fixed', 'mac_addr': 'bb:bb:bb:bb:bb:bb'},
],
'public': [
{'version': 4, 'addr': '172.19.0.1'},
{'version': 4, 'addr': '172.19.0.2'},
{'version': 4, 'addr': '1.2.3.4'},
{'version': 6, 'addr': 'b33f::fdee:ddff:fecc:bbaa'},
{'version': 4, 'addr': '172.19.0.1',
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'},
{'version': 4, 'addr': '172.19.0.2',
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'},
{'version': 4, 'addr': '1.2.3.4',
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'},
{'version': 6, 'addr': 'b33f::fdee:ddff:fecc:bbaa',
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'},
],
},
}
@@ -3979,8 +3991,10 @@ class TestAddressesXMLSerialization(test.TestCase):
def test_xml_declaration(self):
fixture = {
'network_2': [
{'addr': '192.168.0.1', 'version': 4},
{'addr': 'fe80::beef', 'version': 6},
{'addr': '192.168.0.1', 'version': 4,
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'},
{'addr': 'fe80::beef', 'version': 6,
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'}
],
}
output = self.show_serializer.serialize(fixture)
@@ -3990,8 +4004,10 @@ class TestAddressesXMLSerialization(test.TestCase):
def test_show(self):
fixture = {
'network_2': [
{'addr': '192.168.0.1', 'version': 4},
{'addr': 'fe80::beef', 'version': 6},
{'addr': '192.168.0.1', 'version': 4,
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'},
{'addr': 'fe80::beef', 'version': 6,
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'}
],
}
output = self.show_serializer.serialize(fixture)
@@ -4005,23 +4021,31 @@ class TestAddressesXMLSerialization(test.TestCase):
str(ip['version']))
self.assertEqual(str(ip_elem.get('addr')),
str(ip['addr']))
self.assertEqual(str(ip_elem.get('type')),
str(ip['type']))
self.assertEqual(str(ip_elem.get('mac_addr')),
str(ip['mac_addr']))
def test_index(self):
fixture = {
'addresses': {
'network_1': [
{'addr': '192.168.0.3', 'version': 4},
{'addr': '192.168.0.5', 'version': 4},
{'addr': '192.168.0.3', 'version': 4,
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'},
{'addr': '192.168.0.5', 'version': 4,
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'}
],
'network_2': [
{'addr': '192.168.0.1', 'version': 4},
{'addr': 'fe80::beef', 'version': 6},
{'addr': '192.168.0.1', 'version': 4,
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'},
{'addr': 'fe80::beef', 'version': 6,
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'}
],
},
}
output = self.index_serializer.serialize(fixture)
root = etree.XML(output)
xmlutil.validate_schema(root, 'addresses')
xmlutil.validate_schema(root, 'addresses', version='v3')
addresses_dict = fixture['addresses']
network_elems = root.findall('{0}network'.format(NS))
self.assertEqual(len(network_elems), 2)
@@ -4035,6 +4059,10 @@ class TestAddressesXMLSerialization(test.TestCase):
str(ip['version']))
self.assertEqual(str(ip_elem.get('addr')),
str(ip['addr']))
self.assertEqual(str(ip_elem.get('type')),
str(ip['type']))
self.assertEqual(str(ip_elem.get('mac_addr')),
str(ip['mac_addr']))
class ServersViewBuilderTest(test.TestCase):
@@ -4068,7 +4096,7 @@ class ServersViewBuilderTest(test.TestCase):
floaters)
self.uuid = self.instance['uuid']
self.view_builder = views.servers.ViewBuilder()
self.view_builder = views.servers.ViewBuilderV3()
self.request = fakes.HTTPRequestV3.blank("")
def test_get_flavor_valid_instance_type(self):
@@ -4162,8 +4190,10 @@ class ServersViewBuilderTest(test.TestCase):
},
"addresses": {
'test1': [
{'version': 4, 'addr': '192.168.1.100'},
{'version': 6, 'addr': '2001:db8:0:1::1'}
{'version': 4, 'addr': '192.168.1.100',
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'},
{'version': 6, 'addr': '2001:db8:0:1::1',
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'}
]
},
"metadata": {},
@@ -4234,8 +4264,10 @@ class ServersViewBuilderTest(test.TestCase):
},
"addresses": {
'test1': [
{'version': 4, 'addr': '192.168.1.100'},
{'version': 6, 'addr': '2001:db8:0:1::1'}
{'version': 4, 'addr': '192.168.1.100',
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'},
{'version': 6, 'addr': '2001:db8:0:1::1',
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'}
]
},
"metadata": {},
@@ -4380,8 +4412,10 @@ class ServersViewBuilderTest(test.TestCase):
},
"addresses": {
'test1': [
{'version': 4, 'addr': '192.168.1.100'},
{'version': 6, 'addr': '2001:db8:0:1::1'}
{'version': 4, 'addr': '192.168.1.100',
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'},
{'version': 6, 'addr': '2001:db8:0:1::1',
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'}
]
},
"metadata": {},
@@ -4440,8 +4474,10 @@ class ServersViewBuilderTest(test.TestCase):
},
"addresses": {
'test1': [
{'version': 4, 'addr': '192.168.1.100'},
{'version': 6, 'addr': '2001:db8:0:1::1'}
{'version': 4, 'addr': '192.168.1.100',
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'},
{'version': 6, 'addr': '2001:db8:0:1::1',
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'},
]
},
"metadata": {},
@@ -4502,8 +4538,10 @@ class ServersViewBuilderTest(test.TestCase):
},
"addresses": {
'test1': [
{'version': 4, 'addr': '192.168.1.100'},
{'version': 6, 'addr': '2001:db8:0:1::1'}
{'version': 4, 'addr': '192.168.1.100',
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'},
{'version': 6, 'addr': '2001:db8:0:1::1',
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'},
]
},
"metadata": {},
@@ -4568,8 +4606,10 @@ class ServersViewBuilderTest(test.TestCase):
},
"addresses": {
'test1': [
{'version': 4, 'addr': '192.168.1.100'},
{'version': 6, 'addr': '2001:db8:0:1::1'}
{'version': 4, 'addr': '192.168.1.100',
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'},
{'version': 6, 'addr': '2001:db8:0:1::1',
'type': 'fixed', 'mac_addr': 'aa:aa:aa:aa:aa:aa'},
]
},
"metadata": {"Open": "Stack"},
@@ -4638,20 +4678,28 @@ class ServerXMLSerializationTest(test.TestCase):
{
"version": 4,
"addr": "67.23.10.138",
"type": "fixed",
"mac_addr": "aa:aa:aa:aa:aa:aa"
},
{
"version": 6,
"addr": "::babe:67.23.10.138",
"type": "fixed",
"mac_addr": "aa:aa:aa:aa:aa:aa"
},
],
"network_two": [
{
"version": 4,
"addr": "67.23.10.139",
"type": "fixed",
"mac_addr": "aa:aa:aa:aa:aa:aa"
},
{
"version": 6,
"addr": "::babe:67.23.10.139",
"type": "fixed",
"mac_addr": "aa:aa:aa:aa:aa:aa"
},
],
},
@@ -4715,20 +4763,28 @@ class ServerXMLSerializationTest(test.TestCase):
{
"version": 4,
"addr": "67.23.10.138",
"type": "fixed",
"mac_addr": "aa:aa:aa:aa:aa:aa"
},
{
"version": 6,
"addr": "::babe:67.23.10.138",
"type": "fixed",
"mac_addr": "aa:aa:aa:aa:aa:aa"
},
],
"network_two": [
{
"version": 4,
"addr": "67.23.10.139",
"type": "fixed",
"mac_addr": "aa:aa:aa:aa:aa:aa"
},
{
"version": 6,
"addr": "::babe:67.23.10.139",
"type": "fixed",
"mac_addr": "aa:aa:aa:aa:aa:aa"
},
],
},
@@ -4751,7 +4807,7 @@ class ServerXMLSerializationTest(test.TestCase):
output = serializer.serialize(fixture)
root = etree.XML(output)
xmlutil.validate_schema(root, 'server')
xmlutil.validate_schema(root, 'server', version='v3')
server_dict = fixture['server']
@@ -4804,6 +4860,10 @@ class ServerXMLSerializationTest(test.TestCase):
str(ip['version']))
self.assertEqual(str(ip_elem.get('addr')),
str(ip['addr']))
self.assertEqual(str(ip_elem.get('type')),
str(ip['type']))
self.assertEqual(str(ip_elem.get('mac_addr')),
str(ip['mac_addr']))
def test_create(self):
serializer = servers.FullServerTemplate()
@@ -4845,20 +4905,28 @@ class ServerXMLSerializationTest(test.TestCase):
{
"version": 4,
"addr": "67.23.10.138",
"type": "fixed",
"mac_addr": "aa:aa:aa:aa:aa:aa"
},
{
"version": 6,
"addr": "::babe:67.23.10.138",
"type": "fixed",
"mac_addr": "aa:aa:aa:aa:aa:aa"
},
],
"network_two": [
{
"version": 4,
"addr": "67.23.10.139",
"type": "fixed",
"mac_addr": "aa:aa:aa:aa:aa:aa"
},
{
"version": 6,
"addr": "::babe:67.23.10.139",
"type": "fixed",
"mac_addr": "aa:aa:aa:aa:aa:aa"
},
],
},
@@ -4881,7 +4949,7 @@ class ServerXMLSerializationTest(test.TestCase):
output = serializer.serialize(fixture)
root = etree.XML(output)
xmlutil.validate_schema(root, 'server')
xmlutil.validate_schema(root, 'server', version='v3')
server_dict = fixture['server']
@@ -4934,6 +5002,10 @@ class ServerXMLSerializationTest(test.TestCase):
str(ip['version']))
self.assertEqual(str(ip_elem.get('addr')),
str(ip['addr']))
self.assertEqual(str(ip_elem.get('type')),
str(ip['type']))
self.assertEqual(str(ip_elem.get('mac_addr')),
str(ip['mac_addr']))
def test_index(self):
serializer = servers.MinimalServersTemplate()
@@ -4977,7 +5049,7 @@ class ServerXMLSerializationTest(test.TestCase):
output = serializer.serialize(fixture)
root = etree.XML(output)
xmlutil.validate_schema(root, 'servers_index')
xmlutil.validate_schema(root, 'servers_index', version='v3')
server_elems = root.findall('{0}server'.format(NS))
self.assertEqual(len(server_elems), 2)
for i, server_elem in enumerate(server_elems):
@@ -5040,7 +5112,7 @@ class ServerXMLSerializationTest(test.TestCase):
output = serializer.serialize(fixture)
root = etree.XML(output)
xmlutil.validate_schema(root, 'servers_index')
xmlutil.validate_schema(root, 'servers_index', version='v3')
server_elems = root.findall('{0}server'.format(NS))
self.assertEqual(len(server_elems), 2)
for i, server_elem in enumerate(server_elems):
@@ -5108,10 +5180,16 @@ class ServerXMLSerializationTest(test.TestCase):
{
"version": 4,
"addr": "67.23.10.138",
"type": "fixed",
"mac_addr": "aa:aa:aa:aa:aa:aa"
},
{
"version": 6,
"addr": "::babe:67.23.10.138",
"type": "fixed",
"mac_addr": "aa:aa:aa:aa:aa:aa"
},
],
},
@@ -5164,10 +5242,16 @@ class ServerXMLSerializationTest(test.TestCase):
{
"version": 4,
"addr": "67.23.10.138",
"type": "fixed",
"mac_addr": "aa:aa:aa:aa:aa:aa"
},
{
"version": 6,
"addr": "::babe:67.23.10.138",
"type": "fixed",
"mac_addr": "aa:aa:aa:aa:aa:aa"
},
],
},
@@ -5189,7 +5273,7 @@ class ServerXMLSerializationTest(test.TestCase):
output = serializer.serialize(fixture)
root = etree.XML(output)
xmlutil.validate_schema(root, 'servers')
xmlutil.validate_schema(root, 'servers', version='v3')
server_elems = root.findall('{0}server'.format(NS))
self.assertEqual(len(server_elems), 2)
for i, server_elem in enumerate(server_elems):
@@ -5244,6 +5328,10 @@ class ServerXMLSerializationTest(test.TestCase):
str(ip['version']))
self.assertEqual(str(ip_elem.get('addr')),
str(ip['addr']))
self.assertEqual(str(ip_elem.get('type')),
str(ip['type']))
self.assertEqual(str(ip_elem.get('mac_addr')),
str(ip['mac_addr']))
def test_update(self):
serializer = servers.ServerTemplate()
@@ -5284,20 +5372,28 @@ class ServerXMLSerializationTest(test.TestCase):
{
"version": 4,
"addr": "67.23.10.138",
"type": "fixed",
"mac_addr": "aa:aa:aa:aa:aa:aa"
},
{
"version": 6,
"addr": "::babe:67.23.10.138",
"type": "fixed",
"mac_addr": "aa:aa:aa:aa:aa:aa"
},
],
"network_two": [
{
"version": 4,
"addr": "67.23.10.139",
"type": "fixed",
"mac_addr": "aa:aa:aa:aa:aa:aa"
},
{
"version": 6,
"addr": "::babe:67.23.10.139",
"type": "fixed",
"mac_addr": "aa:aa:aa:aa:aa:aa"
},
],
},
@@ -5326,7 +5422,7 @@ class ServerXMLSerializationTest(test.TestCase):
output = serializer.serialize(fixture)
root = etree.XML(output)
xmlutil.validate_schema(root, 'server')
xmlutil.validate_schema(root, 'server', version='v3')
server_dict = fixture['server']
@@ -5379,6 +5475,10 @@ class ServerXMLSerializationTest(test.TestCase):
str(ip['version']))
self.assertEqual(str(ip_elem.get('addr')),
str(ip['addr']))
self.assertEqual(str(ip_elem.get('type')),
str(ip['type']))
self.assertEqual(str(ip_elem.get('mac_addr')),
str(ip['mac_addr']))
fault_root = root.find('{0}fault'.format(NS))
fault_dict = server_dict['fault']
@@ -5429,20 +5529,28 @@ class ServerXMLSerializationTest(test.TestCase):
{
"version": 4,
"addr": "67.23.10.138",
"type": "fixed",
"mac_addr": "aa:aa:aa:aa:aa:aa"
},
{
"version": 6,
"addr": "::babe:67.23.10.138",
"type": "fixed",
"mac_addr": "aa:aa:aa:aa:aa:aa"
},
],
"network_two": [
{
"version": 4,
"addr": "67.23.10.139",
"type": "fixed",
"mac_addr": "aa:aa:aa:aa:aa:aa"
},
{
"version": 6,
"addr": "::babe:67.23.10.139",
"type": "fixed",
"mac_addr": "aa:aa:aa:aa:aa:aa"
},
],
},
@@ -5465,7 +5573,7 @@ class ServerXMLSerializationTest(test.TestCase):
output = serializer.serialize(fixture)
root = etree.XML(output)
xmlutil.validate_schema(root, 'server')
xmlutil.validate_schema(root, 'server', version='v3')
server_dict = fixture['server']
@@ -5518,6 +5626,10 @@ class ServerXMLSerializationTest(test.TestCase):
str(ip['version']))
self.assertEqual(str(ip_elem.get('addr')),
str(ip['addr']))
self.assertEqual(str(ip_elem.get('type')),
str(ip['type']))
self.assertEqual(str(ip_elem.get('mac_addr')),
str(ip['mac_addr']))
class ServersAllExtensionsTestCase(test.TestCase):