Merge "Following up patch of fea6689e7438d3f9590912cb4dd599a5b2c3c611"
This commit is contained in:
commit
b259b2d954
@ -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):
|
||||
|
@ -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):
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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.
|
||||
|
||||
|
@ -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))
|
||||
|
Loading…
x
Reference in New Issue
Block a user