Make nova server_interface function calls work

This patch add a new input parameter 'server_id' for all nova
server_interface related function calls to make them work.
It also removes update_server_interface and
find_server_interface methods since they are not supported by
Nova API.

Change-Id: I68f09c1f8f247b4db55eff87f771ec7a27f1be9b
This commit is contained in:
yanyanhu 2015-11-04 22:16:44 -05:00
parent e35bfd1010
commit 87014be693
4 changed files with 98 additions and 61 deletions

View File

@ -15,7 +15,7 @@ from openstack.compute.v2 import flavor
from openstack.compute.v2 import image from openstack.compute.v2 import image
from openstack.compute.v2 import keypair from openstack.compute.v2 import keypair
from openstack.compute.v2 import limits from openstack.compute.v2 import limits
from openstack.compute.v2 import server from openstack.compute.v2 import server as _server
from openstack.compute.v2 import server_interface from openstack.compute.v2 import server_interface
from openstack.compute.v2 import server_ip from openstack.compute.v2 import server_ip
from openstack import proxy from openstack import proxy
@ -284,7 +284,7 @@ class Proxy(proxy.BaseProxy):
:returns: The results of server creation :returns: The results of server creation
:rtype: :class:`~openstack.compute.v2.server.Server` :rtype: :class:`~openstack.compute.v2.server.Server`
""" """
return self._create(server.Server, **attrs) return self._create(_server.Server, **attrs)
def delete_server(self, value, ignore_missing=True): def delete_server(self, value, ignore_missing=True):
"""Delete a server """Delete a server
@ -299,7 +299,7 @@ class Proxy(proxy.BaseProxy):
:returns: ``None`` :returns: ``None``
""" """
self._delete(server.Server, value, ignore_missing=ignore_missing) self._delete(_server.Server, value, ignore_missing=ignore_missing)
def find_server(self, name_or_id, ignore_missing=True): def find_server(self, name_or_id, ignore_missing=True):
"""Find a single server """Find a single server
@ -312,7 +312,7 @@ class Proxy(proxy.BaseProxy):
attempting to find a nonexistent resource. attempting to find a nonexistent resource.
:returns: One :class:`~openstack.compute.v2.server.Server` or None :returns: One :class:`~openstack.compute.v2.server.Server` or None
""" """
return self._find(server.Server, name_or_id, return self._find(_server.Server, name_or_id,
ignore_missing=ignore_missing) ignore_missing=ignore_missing)
def get_server(self, value): def get_server(self, value):
@ -325,7 +325,7 @@ class Proxy(proxy.BaseProxy):
:raises: :class:`~openstack.exceptions.ResourceNotFound` :raises: :class:`~openstack.exceptions.ResourceNotFound`
when no resource can be found. when no resource can be found.
""" """
return self._get(server.Server, value) return self._get(_server.Server, value)
def servers(self, details=True, **query): def servers(self, details=True, **query):
"""Retrieve a generator of servers """Retrieve a generator of servers
@ -364,7 +364,7 @@ class Proxy(proxy.BaseProxy):
:returns: A generator of server instances. :returns: A generator of server instances.
""" """
srv = server.ServerDetail if details else server.Server srv = _server.ServerDetail if details else _server.Server
# Server expects changes-since, but we use an underscore # Server expects changes-since, but we use an underscore
# so it can be a proper Python name. # so it can be a proper Python name.
@ -384,16 +384,19 @@ class Proxy(proxy.BaseProxy):
:returns: The updated server :returns: The updated server
:rtype: :class:`~openstack.compute.v2.server.Server` :rtype: :class:`~openstack.compute.v2.server.Server`
""" """
return self._update(server.Server, value, **attrs) return self._update(_server.Server, value, **attrs)
def wait_for_server(self, value, status='ACTIVE', failures=['ERROR'], def wait_for_server(self, value, status='ACTIVE', failures=['ERROR'],
interval=2, wait=120): interval=2, wait=120):
return resource.wait_for_status(self.session, value, status, return resource.wait_for_status(self.session, value, status,
failures, interval, wait) failures, interval, wait)
def create_server_interface(self, **attrs): def create_server_interface(self, server, **attrs):
"""Create a new server interface from attributes """Create a new server interface from attributes
:param server: The server can be either the ID of a server or a
:class:`~openstack.compute.v2.server.Server` instance
that the interface belongs to.
:param dict attrs: Keyword arguments which will be used to create :param dict attrs: Keyword arguments which will be used to create
a :class:`~openstack.compute.v2.server_interface.ServerInterface`, a :class:`~openstack.compute.v2.server_interface.ServerInterface`,
comprised of the properties on the ServerInterface class. comprised of the properties on the ServerInterface class.
@ -401,14 +404,20 @@ class Proxy(proxy.BaseProxy):
:returns: The results of server interface creation :returns: The results of server interface creation
:rtype: :class:`~openstack.compute.v2.server_interface.ServerInterface` :rtype: :class:`~openstack.compute.v2.server_interface.ServerInterface`
""" """
return self._create(server_interface.ServerInterface, **attrs) server_id = resource.Resource.get_id(server)
return self._create(server_interface.ServerInterface,
path_args={'server_id': server_id}, **attrs)
def delete_server_interface(self, value, ignore_missing=True): def delete_server_interface(self, value, server=None, ignore_missing=True):
"""Delete a server interface """Delete a server interface
:param value: The value can be either the ID of a server or a :param value: The value can be either the ID of a server interface or a
:class:`~openstack.compute.v2.server_interface.ServerInterface` :class:`~openstack.compute.v2.server_interface.ServerInterface`
instance. instance.
:param server: This parameter need to be specified when ServerInterface
ID is given as value. It can be either the ID of a
server or a :class:`~openstack.compute.v2.server.Server`
instance that the interface belongs to.
:param bool ignore_missing: When set to ``False`` :param bool ignore_missing: When set to ``False``
:class:`~openstack.exceptions.ResourceNotFound` will be :class:`~openstack.exceptions.ResourceNotFound` will be
raised when the server interface does not exist. raised when the server interface does not exist.
@ -417,65 +426,55 @@ class Proxy(proxy.BaseProxy):
:returns: ``None`` :returns: ``None``
""" """
if isinstance(value, server_interface.ServerInterface):
server_id = value.server_id
else:
server_id = resource.Resource.get_id(server)
self._delete(server_interface.ServerInterface, value, self._delete(server_interface.ServerInterface, value,
path_args={'server_id': server_id},
ignore_missing=ignore_missing) ignore_missing=ignore_missing)
def find_server_interface(self, name_or_id, ignore_missing=True): def get_server_interface(self, value, server=None):
"""Find a single server interface
:param name_or_id: The name or ID of a server interface.
:param bool ignore_missing: When set to ``False``
:class:`~openstack.exceptions.ResourceNotFound` will be
raised when the resource does not exist.
When set to ``True``, None will be returned when
attempting to find a nonexistent resource.
:returns: One :class:`~openstack.compute.v2.server_interface.
ServerInterface` or None
"""
return self._find(server_interface.ServerInterface,
name_or_id, ignore_missing=ignore_missing)
def get_server_interface(self, value):
"""Get a single server interface """Get a single server interface
:param value: The value can be the ID of a server interface or a :param value: The value can be the ID of a server interface or a
:class:`~openstack.compute.v2.server_interface.ServerInterface` :class:`~openstack.compute.v2.server_interface.ServerInterface`
instance. instance.
:param server: This parameter need to be specified when ServerInterface
ID is given as value. It can be either the ID of a
server or a :class:`~openstack.compute.v2.server.Server`
instance that the interface belongs to.
:returns: One :returns: One
:class:`~openstack.compute.v2.server_interface.ServerInterface` :class:`~openstack.compute.v2.server_interface.ServerInterface`
:raises: :class:`~openstack.exceptions.ResourceNotFound` :raises: :class:`~openstack.exceptions.ResourceNotFound`
when no resource can be found. when no resource can be found.
""" """
return self._get(server_interface.ServerInterface, value) if isinstance(value, server_interface.ServerInterface):
server_id = value.server_id
else:
server_id = resource.Resource.get_id(server)
def server_interfaces(self, **query): return self._get(server_interface.ServerInterface, value,
path_args={'server_id': server_id})
def server_interfaces(self, server, **query):
"""Return a generator of server interfaces """Return a generator of server interfaces
:param server: The server can be either the ID of a server or a
:class:`~openstack.compute.v2.server.Server`.
:param kwargs \*\*query: Optional query parameters to be sent to limit :param kwargs \*\*query: Optional query parameters to be sent to limit
the resources being returned. the resources being returned.
:returns: A generator of ServerInterface objects :returns: A generator of ServerInterface objects
:rtype: :class:`~openstack.compute.v2.server_interface.ServerInterface` :rtype: :class:`~openstack.compute.v2.server_interface.ServerInterface`
""" """
server_id = resource.Resource.get_id(server)
return self._list(server_interface.ServerInterface, paginated=False, return self._list(server_interface.ServerInterface, paginated=False,
path_args={'server_id': server_id},
**query) **query)
def update_server_interface(self, value, **attrs):
"""Update a server interface
:param value: Either the id of a server interface or a
:class:
`~openstack.compute.v2.server_interface.ServerInterface`
instance.
:attrs kwargs: The attributes to update on the server interface
represented by ``value``.
:returns: The updated server interface
:rtype: :class:`~openstack.compute.v2.server_interface.ServerInterface`
"""
return self._update(server_interface.ServerInterface, value, **attrs)
def find_server_ip(self, name_or_id, ignore_missing=True): def find_server_ip(self, name_or_id, ignore_missing=True):
"""Find a single server IP """Find a single server IP

View File

@ -15,7 +15,7 @@ from openstack import resource
class ServerInterface(resource.Resource): class ServerInterface(resource.Resource):
id_attribute = 'mac_addr' id_attribute = 'port_id'
resource_key = 'interfaceAttachment' resource_key = 'interfaceAttachment'
resources_key = 'interfaceAttachments' resources_key = 'interfaceAttachments'
base_path = '/servers/%(server_id)s/os-interface' base_path = '/servers/%(server_id)s/os-interface'

View File

@ -115,32 +115,70 @@ class TestComputeProxy(test_proxy_base.TestProxyBase):
def test_server_interface_create(self): def test_server_interface_create(self):
self.verify_create(self.proxy.create_server_interface, self.verify_create(self.proxy.create_server_interface,
server_interface.ServerInterface) server_interface.ServerInterface,
method_kwargs={"server": "test_id"},
expected_kwargs={"path_args": {
"server_id": "test_id"}})
def test_server_interface_delete(self): def test_server_interface_delete(self):
self.verify_delete(self.proxy.delete_server_interface, test_interface = server_interface.ServerInterface.from_id(
server_interface.ServerInterface, False) "test_interface_id")
test_interface.server_id = "test_server_id"
# Case1: ServerInterface instance is provided as value
self._verify2("openstack.proxy.BaseProxy._delete",
self.proxy.delete_server_interface,
method_args=[test_interface, "test_server_id"],
expected_args=[server_interface.ServerInterface,
test_interface],
expected_kwargs={"path_args": {
"server_id": "test_server_id"},
"ignore_missing": True})
# Case2: ServerInterface ID is provided as value
self._verify2("openstack.proxy.BaseProxy._delete",
self.proxy.delete_server_interface,
method_args=["test_interface_id", "test_server_id"],
expected_args=[server_interface.ServerInterface,
"test_interface_id"],
expected_kwargs={"path_args": {
"server_id": "test_server_id"},
"ignore_missing": True})
def test_server_interface_delete_ignore(self): def test_server_interface_delete_ignore(self):
self.verify_delete(self.proxy.delete_server_interface, self.verify_delete(self.proxy.delete_server_interface,
server_interface.ServerInterface, True) server_interface.ServerInterface, True,
{"server": "test_id"}, {"server_id": "test_id"})
def test_server_interface_find(self):
self.verify_find(self.proxy.find_server_interface,
server_interface.ServerInterface)
def test_server_interface_get(self): def test_server_interface_get(self):
self.verify_get(self.proxy.get_server_interface, test_interface = server_interface.ServerInterface.from_id(
server_interface.ServerInterface) "test_interface_id")
test_interface.server_id = "test_server_id"
# Case1: ServerInterface instance is provided as value
self._verify2('openstack.proxy.BaseProxy._get',
self.proxy.get_server_interface,
method_args=[test_interface, "test_id"],
expected_args=[server_interface.ServerInterface,
test_interface],
expected_kwargs={"path_args": {
"server_id": "test_server_id"}})
# Case2: ServerInterface ID is provided as value
self._verify2('openstack.proxy.BaseProxy._get',
self.proxy.get_server_interface,
method_args=["test_interface_id", "test_server_id"],
expected_args=[server_interface.ServerInterface,
"test_interface_id"],
expected_kwargs={"path_args": {
"server_id": "test_server_id"}})
def test_server_interfaces(self): def test_server_interfaces(self):
self.verify_list(self.proxy.server_interfaces, self.verify_list(self.proxy.server_interfaces,
server_interface.ServerInterface, server_interface.ServerInterface,
paginated=False) paginated=False, method_args=["test_id"],
expected_kwargs={"path_args": {
def test_server_interface_update(self): "server_id": "test_id"}})
self.verify_update(self.proxy.update_server_interface,
server_interface.ServerInterface)
def test_server_ip_find(self): def test_server_ip_find(self):
self.verify_find(self.proxy.find_server_ip, server_ip.ServerIP) self.verify_find(self.proxy.find_server_ip, server_ip.ServerIP)

View File

@ -47,7 +47,7 @@ class TestServerInterface(testtools.TestCase):
def test_make_it(self): def test_make_it(self):
sot = server_interface.ServerInterface(EXAMPLE) sot = server_interface.ServerInterface(EXAMPLE)
self.assertEqual(EXAMPLE['fixed_ips'], sot.fixed_ips) self.assertEqual(EXAMPLE['fixed_ips'], sot.fixed_ips)
self.assertEqual(EXAMPLE['mac_addr'], sot.id) self.assertEqual(EXAMPLE['port_id'], sot.id)
self.assertEqual(EXAMPLE['mac_addr'], sot.mac_addr) self.assertEqual(EXAMPLE['mac_addr'], sot.mac_addr)
self.assertEqual(EXAMPLE['net_id'], sot.net_id) self.assertEqual(EXAMPLE['net_id'], sot.net_id)
self.assertEqual(EXAMPLE['port_id'], sot.port_id) self.assertEqual(EXAMPLE['port_id'], sot.port_id)