Merge "Following up patch of fea6689e7438d3f9590912cb4dd599a5b2c3c611"

This commit is contained in:
Jenkins 2017-05-22 08:08:48 +00:00 committed by Gerrit Code Review
commit b259b2d954
6 changed files with 22 additions and 57 deletions

View File

@ -37,7 +37,6 @@ from mogan.common import exception
from mogan.common.i18n import _
from mogan.common import policy
from mogan.common import states
from mogan.common import utils
from mogan import network
from mogan import objects
@ -361,13 +360,13 @@ class InterfaceController(ServerControllerBase):
pecan.request.context,
server, net_id)
except (exception.ServerIsLocked,
exception.ComputePortInUse,
exception.ComputePortNotAvailable,
exception.NetworkNotFound) as e:
raise wsme.exc.ClientSideError(
e.message, status_code=http_client.BAD_REQUEST)
except exception.InterfaceAttachFailed as state_error:
utils.raise_http_conflict_for_server_invalid_state(
state_error, 'attach_interface', server_uuid)
except exception.InterfaceAttachFailed as e:
raise wsme.exc.ClientSideError(
e.message, status_code=http_client.CONFLICT)
class ServerNetworks(base.APIBase):

View File

@ -190,8 +190,8 @@ class ComputePortNotFound(NotFound):
_msg_fmt = _("ComputePort %(port)s could not be found.")
class ComputePortInUse(Invalid):
_msg_fmt = _("ComputePort id %(port)s is in use.")
class ComputePortNotAvailable(NotFound):
_msg_fmt = _("No available compute ports.")
class ComputeDiskAlreadyExists(MoganException):

View File

@ -25,7 +25,6 @@ import re
import shutil
import tempfile
import traceback
import webob
from cryptography.hazmat import backends
from cryptography.hazmat.primitives import hashes
@ -410,22 +409,3 @@ def generate_key_pair(bits=2048):
key.get_name(), key.get_base64())
fingerprint = generate_fingerprint(public_key)
return (private_key, public_key, fingerprint)
def raise_http_conflict_for_server_invalid_state(exc, action, server_id):
"""Raises a webob.exc.HTTPConflict instance containing a message
appropriate to return via the API based on the original
ServerInvalidState exception.
"""
attr = exc.kwargs.get('attr')
state = exc.kwargs.get('state')
if attr is not None and state is not None:
msg = _("Cannot '%(action)s' server %(server_id)s while it is in "
"%(attr)s %(state)s") % {'action': action, 'attr': attr,
'state': state,
'server_id': server_id}
else:
# At least give some meaningful message
msg = _("Server %(server_id)s is in an invalid state for "
"'%(action)s'") % {'action': action, 'server_id': server_id}
raise webob.exc.HTTPConflict(explanation=msg)

View File

@ -513,5 +513,6 @@ class API(object):
"""Get a keypair by name."""
return objects.KeyPair.get_by_name(context, user_id, key_name)
@check_server_lock
def attach_interface(self, context, server, net_id):
self.engine_rpcapi.attach_interface(context, server, net_id)

View File

@ -87,14 +87,6 @@ class IronicDriver(base_driver.BaseEngineDriver):
return self.ironicclient.call('node.get', node_uuid,
fields=_NODE_FIELDS)
def get_node_by_server_uuid(self, server_uuid):
"""Get the node by server uuid"""
try:
return self.ironicclient.call('node.get_by_instance_uuid',
server_uuid, fields=_NODE_FIELDS)
except ironic_exc.NotFound:
raise exception.ServerNotFound(server=server_uuid)
def _validate_server_and_node(self, server):
"""Get the node associated with the server.

View File

@ -554,38 +554,31 @@ class EngineManager(base_manager.BaseEngineManager):
'internal_access_path': None}
def _choose_pif_from_node(self, context, node):
pifs = self.driver.get_ports_from_node(node.uuid, detail=True)
pif_ids = []
pifs = self.driver.get_ports_from_node(node, detail=True)
for pif in pifs:
pif_ids.append(pif.uuid)
vif = pif.extra.get('vif_port_id', None)
if not vif:
return pif
if not pif_ids:
LOG.debug("Node %(node.uuid)s has no pysical ports. ")
else:
raise exception.ComputePortInUse(port=pif_ids)
def _check_server_state(self, context, server):
if server.locked and not context.is_admin:
raise exception.ServerIsLocked(server_uuid=server.uuid)
# if no available compute ports, raise exception
message = "Node %s has no available pysical ports." % node
LOG.error(message)
raise exception.ComputePortNotAvailable(message=message)
def attach_interface(self, context, server, net_id=None):
self._check_server_state(context, server)
node = self.driver.get_node_by_server_uuid(server.uuid)
pif = self._choose_pif_from_node(context, node)
mac = pif.address
vif = self.network_api.create_port(context, net_id, mac, server.uuid)
vif_dict = vif['port']
pif = self._choose_pif_from_node(context, server.node_uuid)
vif = self.network_api.create_port(
context, net_id, pif.address, server.uuid)
vif_port = vif['port']
try:
self.driver.plug_vif(pif.uuid, vif_dict['id'])
self.driver.plug_vif(pif.uuid, vif_port['id'])
nics_obj = objects.ServerNics(context)
nic_dict = {'port_id': vif_dict['id'],
'network_id': vif_dict['network_id'],
'mac_address': vif_dict['mac_address'],
'fixed_ips': vif_dict['fixed_ips'],
'port_type': vif_dict.get('port_type'),
nic_dict = {'port_id': vif_port['id'],
'network_id': vif_port['network_id'],
'mac_address': vif_port['mac_address'],
'fixed_ips': vif_port['fixed_ips'],
'port_type': vif_port.get('port_type'),
'server_uuid': server.uuid}
nics_obj.objects.append(objects.ServerNic(
context, **nic_dict))