Merge "Segregate the VSM calls from database calls in N1kv plugin"

This commit is contained in:
Jenkins 2014-05-02 20:56:17 +00:00 committed by Gerrit Code Review
commit 2b4ce6882f

View File

@ -826,45 +826,34 @@ class N1kvNeutronPluginV2(db_base_plugin_v2.NeutronDbPluginV2,
n1kvclient.update_network_segment(subnet['network_id'], body=body) n1kvclient.update_network_segment(subnet['network_id'], body=body)
n1kvclient.delete_ip_pool(subnet['id']) n1kvclient.delete_ip_pool(subnet['id'])
def _send_create_port_request(self, context, port): def _send_create_port_request(self,
context,
port,
port_count,
policy_profile,
vm_network_name):
""" """
Send create port request to VSM. Send create port request to VSM.
Create a VM network for a network and policy profile combination. Create a VM network for a network and policy profile combination.
If the VM network already exists, bind this port to the existing If the VM network already exists, bind this port to the existing
VM network and increment its port count. VM network on the VSM.
:param context: neutron api request context :param context: neutron api request context
:param port: port dictionary :param port: port dictionary
:param port_count: integer representing the number of ports in one
VM Network
:param policy_profile: object of type policy profile
:param vm_network_name: string representing the name of the VM
network
""" """
LOG.debug(_('_send_create_port_request: %s'), port) LOG.debug(_('_send_create_port_request: %s'), port)
try: n1kvclient = n1kv_client.Client()
vm_network = n1kv_db_v2.get_vm_network( if port_count == 1:
context.session,
port[n1kv.PROFILE_ID],
port['network_id'])
except cisco_exceptions.VMNetworkNotFound:
policy_profile = n1kv_db_v2.get_policy_profile(
context.session, port[n1kv.PROFILE_ID])
vm_network_name = (c_const.VM_NETWORK_NAME_PREFIX +
str(port[n1kv.PROFILE_ID]) +
"_" + str(port['network_id']))
port_count = 1
n1kv_db_v2.add_vm_network(context.session,
vm_network_name,
port[n1kv.PROFILE_ID],
port['network_id'],
port_count)
n1kvclient = n1kv_client.Client()
n1kvclient.create_vm_network(port, n1kvclient.create_vm_network(port,
vm_network_name, vm_network_name,
policy_profile) policy_profile)
else: else:
vm_network_name = vm_network['name']
n1kvclient = n1kv_client.Client()
n1kvclient.create_n1kv_port(port, vm_network_name) n1kvclient.create_n1kv_port(port, vm_network_name)
vm_network['port_count'] += 1
n1kv_db_v2.update_vm_network_port_count(
context.session, vm_network_name, vm_network['port_count'])
def _send_update_port_request(self, port_id, mac_address, vm_network_name): def _send_update_port_request(self, port_id, mac_address, vm_network_name):
""" """
@ -880,29 +869,20 @@ class N1kvNeutronPluginV2(db_base_plugin_v2.NeutronDbPluginV2,
n1kvclient = n1kv_client.Client() n1kvclient = n1kv_client.Client()
n1kvclient.update_n1kv_port(vm_network_name, port_id, body) n1kvclient.update_n1kv_port(vm_network_name, port_id, body)
def _send_delete_port_request(self, context, id): def _send_delete_port_request(self, context, port, vm_network):
""" """
Send delete port request to VSM. Send delete port request to VSM.
Decrement the port count of the VM network after deleting the port. Delete the port on the VSM. If it is the last port on the VM Network,
If the port count reaches zero, delete the VM network. delete the VM Network.
:param context: neutron api request context :param context: neutron api request context
:param id: UUID of the port to be deleted :param port: port object which is to be deleted
:param vm_network: VM network object with which the port is associated
""" """
LOG.debug(_('_send_delete_port_request: %s'), id) LOG.debug(_('_send_delete_port_request: %s'), port['id'])
port = self.get_port(context, id)
vm_network = n1kv_db_v2.get_vm_network(context.session,
port[n1kv.PROFILE_ID],
port['network_id'])
vm_network['port_count'] -= 1
n1kv_db_v2.update_vm_network_port_count(
context.session, vm_network['name'], vm_network['port_count'])
n1kvclient = n1kv_client.Client() n1kvclient = n1kv_client.Client()
n1kvclient.delete_n1kv_port(vm_network['name'], id) n1kvclient.delete_n1kv_port(vm_network['name'], port['id'])
if vm_network['port_count'] == 0: if vm_network['port_count'] == 0:
n1kv_db_v2.delete_vm_network(context.session,
port[n1kv.PROFILE_ID],
port['network_id'])
n1kvclient.delete_vm_network(vm_network['name']) n1kvclient.delete_vm_network(vm_network['name'])
def _get_segmentation_id(self, context, id): def _get_segmentation_id(self, context, id):
@ -990,19 +970,16 @@ class N1kvNeutronPluginV2(db_base_plugin_v2.NeutronDbPluginV2,
self._process_l3_create(context, net, network['network']) self._process_l3_create(context, net, network['network'])
self._extend_network_dict_provider(context, net) self._extend_network_dict_provider(context, net)
self._extend_network_dict_profile(context, net) self._extend_network_dict_profile(context, net)
try: try:
if network_type == c_const.NETWORK_TYPE_MULTI_SEGMENT: if network_type == c_const.NETWORK_TYPE_MULTI_SEGMENT:
self._send_add_multi_segment_request(context, net['id'], self._send_add_multi_segment_request(context, net['id'],
segment_pairs) segment_pairs)
else: else:
self._send_create_network_request(context, net, segment_pairs) self._send_create_network_request(context, net, segment_pairs)
# note - exception will rollback entire transaction
except(cisco_exceptions.VSMError, except(cisco_exceptions.VSMError,
cisco_exceptions.VSMConnectionFailed): cisco_exceptions.VSMConnectionFailed):
super(N1kvNeutronPluginV2, self).delete_network(context, net['id']) super(N1kvNeutronPluginV2, self).delete_network(context, net['id'])
else: else:
# note - exception will rollback entire transaction
LOG.debug(_("Created network: %s"), net['id']) LOG.debug(_("Created network: %s"), net['id'])
return net return net
@ -1088,13 +1065,12 @@ class N1kvNeutronPluginV2(db_base_plugin_v2.NeutronDbPluginV2,
elif binding.network_type == c_const.NETWORK_TYPE_VLAN: elif binding.network_type == c_const.NETWORK_TYPE_VLAN:
n1kv_db_v2.release_vlan(session, binding.physical_network, n1kv_db_v2.release_vlan(session, binding.physical_network,
binding.segmentation_id) binding.segmentation_id)
# the network_binding record is deleted via cascade from
# the network record, so explicit removal is not necessary
self._send_delete_network_request(context, network)
self._process_l3_delete(context, id) self._process_l3_delete(context, id)
super(N1kvNeutronPluginV2, self).delete_network(context, id) super(N1kvNeutronPluginV2, self).delete_network(context, id)
LOG.debug(_("Deleted network: %s"), id) # the network_binding record is deleted via cascade from
# the network record, so explicit removal is not necessary
self._send_delete_network_request(context, network)
LOG.debug(_("Deleted network: %s"), id)
def get_network(self, context, id, fields=None): def get_network(self, context, id, fields=None):
""" """
@ -1147,6 +1123,12 @@ class N1kvNeutronPluginV2(db_base_plugin_v2.NeutronDbPluginV2,
:param port: port dictionary :param port: port dictionary
:returns: port object :returns: port object
""" """
p_profile = None
port_count = None
vm_network_name = None
profile_id_set = False
# Set the network policy profile id for auto generated L3/DHCP ports
if ('device_id' in port['port'] and port['port']['device_owner'] in if ('device_id' in port['port'] and port['port']['device_owner'] in
[constants.DEVICE_OWNER_DHCP, constants.DEVICE_OWNER_ROUTER_INTF, [constants.DEVICE_OWNER_DHCP, constants.DEVICE_OWNER_ROUTER_INTF,
constants.DEVICE_OWNER_ROUTER_GW, constants.DEVICE_OWNER_ROUTER_GW,
@ -1156,11 +1138,11 @@ class N1kvNeutronPluginV2(db_base_plugin_v2.NeutronDbPluginV2,
if p_profile: if p_profile:
port['port']['n1kv:profile_id'] = p_profile['id'] port['port']['n1kv:profile_id'] = p_profile['id']
profile_id_set = False
if n1kv.PROFILE_ID in port['port']: if n1kv.PROFILE_ID in port['port']:
profile_id = port['port'].get(n1kv.PROFILE_ID) profile_id = port['port'].get(n1kv.PROFILE_ID)
profile_id_set = attributes.is_attr_set(profile_id) profile_id_set = attributes.is_attr_set(profile_id)
# Set the default policy profile id for ports if no id is set
if not profile_id_set: if not profile_id_set:
p_profile_name = c_conf.CISCO_N1K.default_policy_profile p_profile_name = c_conf.CISCO_N1K.default_policy_profile
p_profile = self._get_policy_profile_by_name(p_profile_name) p_profile = self._get_policy_profile_by_name(p_profile_name)
@ -1168,27 +1150,56 @@ class N1kvNeutronPluginV2(db_base_plugin_v2.NeutronDbPluginV2,
port['port']['n1kv:profile_id'] = p_profile['id'] port['port']['n1kv:profile_id'] = p_profile['id']
profile_id_set = True profile_id_set = True
if profile_id_set: profile_id = self._process_policy_profile(context,
profile_id = self._process_policy_profile(context, port['port'])
port['port']) LOG.debug(_('Create port: profile_id=%s'), profile_id)
LOG.debug(_('Create port: profile_id=%s'), profile_id) session = context.session
session = context.session with session.begin(subtransactions=True):
with session.begin(subtransactions=True): pt = super(N1kvNeutronPluginV2, self).create_port(context,
pt = super(N1kvNeutronPluginV2, self).create_port(context, port)
port) n1kv_db_v2.add_port_binding(session, pt['id'], profile_id)
n1kv_db_v2.add_port_binding(session, pt['id'], profile_id) self._extend_port_dict_profile(context, pt)
self._extend_port_dict_profile(context, pt)
self._process_portbindings_create_and_update(context,
port['port'],
pt)
try: try:
self._send_create_port_request(context, pt) vm_network = n1kv_db_v2.get_vm_network(
except(cisco_exceptions.VSMError, context.session,
cisco_exceptions.VSMConnectionFailed): profile_id,
super(N1kvNeutronPluginV2, self).delete_port(context, pt['id']) pt['network_id'])
except cisco_exceptions.VMNetworkNotFound:
# Create a VM Network if no VM network exists.
vm_network_name = "%s%s_%s" % (c_const.VM_NETWORK_NAME_PREFIX,
profile_id,
pt['network_id'])
port_count = 1
n1kv_db_v2.add_vm_network(context.session,
vm_network_name,
profile_id,
pt['network_id'],
port_count)
else: else:
LOG.debug(_("Created port: %s"), pt) # Update port count of the VM network.
return pt vm_network_name = vm_network['name']
port_count = vm_network['port_count'] + 1
n1kv_db_v2.update_vm_network_port_count(context.session,
vm_network_name,
port_count)
self._process_portbindings_create_and_update(context,
port['port'],
pt)
# Extract policy profile for VM network create in VSM.
if not p_profile:
p_profile = n1kv_db_v2.get_policy_profile(session, profile_id)
try:
self._send_create_port_request(context,
pt,
port_count,
p_profile,
vm_network_name)
except(cisco_exceptions.VSMError,
cisco_exceptions.VSMConnectionFailed):
super(N1kvNeutronPluginV2, self).delete_port(context, pt['id'])
else:
LOG.debug(_("Created port: %s"), pt)
return pt
def update_port(self, context, id, port): def update_port(self, context, id, port):
""" """
@ -1220,9 +1231,21 @@ class N1kvNeutronPluginV2(db_base_plugin_v2.NeutronDbPluginV2,
if l3_port_check: if l3_port_check:
self.prevent_l3_port_deletion(context, id) self.prevent_l3_port_deletion(context, id)
with context.session.begin(subtransactions=True): with context.session.begin(subtransactions=True):
port = self.get_port(context, id)
vm_network = n1kv_db_v2.get_vm_network(context.session,
port[n1kv.PROFILE_ID],
port['network_id'])
vm_network['port_count'] -= 1
n1kv_db_v2.update_vm_network_port_count(context.session,
vm_network['name'],
vm_network['port_count'])
if vm_network['port_count'] == 0:
n1kv_db_v2.delete_vm_network(context.session,
port[n1kv.PROFILE_ID],
port['network_id'])
self.disassociate_floatingips(context, id) self.disassociate_floatingips(context, id)
self._send_delete_port_request(context, id)
super(N1kvNeutronPluginV2, self).delete_port(context, id) super(N1kvNeutronPluginV2, self).delete_port(context, id)
self._send_delete_port_request(context, port, vm_network)
def get_port(self, context, id, fields=None): def get_port(self, context, id, fields=None):
""" """
@ -1361,22 +1384,22 @@ class N1kvNeutronPluginV2(db_base_plugin_v2.NeutronDbPluginV2,
net_p = super(N1kvNeutronPluginV2, net_p = super(N1kvNeutronPluginV2,
self).create_network_profile(context, self).create_network_profile(context,
network_profile) network_profile)
try: try:
self._send_create_logical_network_request(net_p, self._send_create_logical_network_request(net_p,
context.tenant_id) context.tenant_id)
except(cisco_exceptions.VSMError, except(cisco_exceptions.VSMError,
cisco_exceptions.VSMConnectionFailed): cisco_exceptions.VSMConnectionFailed):
n1kv_db_v2.delete_profile_binding(context.session, n1kv_db_v2.delete_profile_binding(context.session,
context.tenant_id, context.tenant_id,
net_p['id']) net_p['id'])
try: try:
self._send_create_network_profile_request(context, net_p) self._send_create_network_profile_request(context, net_p)
except(cisco_exceptions.VSMError, except(cisco_exceptions.VSMError,
cisco_exceptions.VSMConnectionFailed): cisco_exceptions.VSMConnectionFailed):
n1kv_db_v2.delete_profile_binding(context.session, n1kv_db_v2.delete_profile_binding(context.session,
context.tenant_id, context.tenant_id,
net_p['id']) net_p['id'])
self._send_delete_logical_network_request(net_p) self._send_delete_logical_network_request(net_p)
return net_p return net_p
def delete_network_profile(self, context, id): def delete_network_profile(self, context, id):
@ -1390,8 +1413,8 @@ class N1kvNeutronPluginV2(db_base_plugin_v2.NeutronDbPluginV2,
with context.session.begin(subtransactions=True): with context.session.begin(subtransactions=True):
net_p = super(N1kvNeutronPluginV2, net_p = super(N1kvNeutronPluginV2,
self).delete_network_profile(context, id) self).delete_network_profile(context, id)
self._send_delete_network_profile_request(net_p) self._send_delete_network_profile_request(net_p)
self._send_delete_logical_network_request(net_p) self._send_delete_logical_network_request(net_p)
def update_network_profile(self, context, net_profile_id, network_profile): def update_network_profile(self, context, net_profile_id, network_profile):
""" """
@ -1407,8 +1430,8 @@ class N1kvNeutronPluginV2(db_base_plugin_v2.NeutronDbPluginV2,
update_network_profile(context, update_network_profile(context,
net_profile_id, net_profile_id,
network_profile)) network_profile))
self._send_update_network_profile_request(net_p) self._send_update_network_profile_request(net_p)
return net_p return net_p
def create_router(self, context, router): def create_router(self, context, router):
""" """