def test_plug_interface(self): lswitch, lport = self._create_switch_and_port() switchlib.plug_vif_interface(self.fake_cluster, lswitch['uuid'], lport['uuid'], 'VifAttachment', 'fake') lport_res = switchlib.get_port(self.fake_cluster, lswitch['uuid'], lport['uuid']) self.assertEqual(lport['uuid'], lport_res['uuid'])
def test_plug_interface(self): lswitch, lport = self._create_switch_and_port() switchlib.plug_vif_interface(self.fake_cluster, lswitch['uuid'], lport['uuid'], 'VifAttachment', 'fake') lport_res = switchlib.get_port(self.fake_cluster, lswitch['uuid'], lport['uuid']) self.assertEqual(lport['uuid'], lport_res['uuid'])
def create_port_precommit(self, context): #TODO: mac_learning port_data = context.current if port_data['device_owner'] == n_const.DEVICE_OWNER_FLOATINGIP: return # no need to process further for fip nsx_port = None nsx_switch = None nsx_switch = self._find_lswitch( context, port_data['network_id'] ) nsx_sec_profile_ids = self._convert_to_nsx_secgroup_ids( context, port_data.get('security_groups') or [] ) nsx_port = switchlib.create_lport( self.cluster, nsx_switch['uuid'], port_data['tenant_id'], port_data['id'], port_data['name'], port_data['device_id'], port_data['admin_state_up'], port_data['mac_address'], port_data['fixed_ips'], port_security_enabled=port_data['port_security_enabled'], security_profiles=nsx_sec_profile_ids, mac_learning_enabled=None, # TODO allowed_address_pairs=port_data['allowed_address_pairs'] ) nsx_db.add_neutron_nsx_port_mapping( context._plugin_context.session, port_data['id'], nsx_switch['uuid'], nsx_port['uuid'] ) if port_data['device_owner']: switchlib.plug_vif_interface( self.cluster, nsx_switch['uuid'], nsx_port['uuid'], "VifAttachment", port_data['id'] ) LOG.debug("port created on NSX backend for tenant " "%(tenant_id)s: (%(id)s)", port_data)
def _nsx_create_port(self, context, port_data): """Driver for creating a logical switch port on NSX platform.""" # FIXME(salvatore-orlando): On the NSX platform we do not really have # external networks. So if as user tries and create a "regular" VIF # port on an external network we are unable to actually create. # However, in order to not break unit tests, we need to still create # the DB object and return success # NOTE(rods): Reporting mark's comment on havana version of this patch. # Akanda does want ports for external networks so this method is # basically same with external check removed and the auto plugging of # router ports # --------------------------------------------------------------------- # Note(rods): Remove the check on the external network # # Original code: # if self._network_is_external(context, port_data['network_id']): # LOG.info(_("NSX plugin does not support regular VIF ports on " # "external networks. Port %s will be down."), # port_data['network_id']) # # No need to actually update the DB state - the default is down # return port_data # --------------------------------------------------------------------- lport = None selected_lswitch = None try: selected_lswitch = self._nsx_find_lswitch_for_port(context, port_data) lport = self._nsx_create_port_helper(context.session, selected_lswitch['uuid'], port_data, True) nsx_db.add_neutron_nsx_port_mapping( context.session, port_data['id'], selected_lswitch['uuid'], lport['uuid']) # ----------------------------------------------------------------- # Note(rods): Auto plug router ports # # Original code: # if port_data['device_owner'] not in self.port_special_owners: # switchlib.plug_vif_interface( # self.cluster, selected_lswitch['uuid'], # lport['uuid'], "VifAttachment", port_data['id']) switchlib.plug_vif_interface( self.cluster, selected_lswitch['uuid'], lport['uuid'], "VifAttachment", port_data['id']) # ----------------------------------------------------------------- LOG.debug(_("_nsx_create_port completed for port %(name)s " "on network %(network_id)s. The new port id is " "%(id)s."), port_data) except (api_exc.NsxApiException, n_exc.NeutronException): self._handle_create_port_exception( context, port_data['id'], selected_lswitch and selected_lswitch['uuid'], lport and lport['uuid']) except db_exc.DBError as e: if (port_data['device_owner'] == constants.DEVICE_OWNER_DHCP and isinstance(e.inner_exception, sql_exc.IntegrityError)): msg = (_("Concurrent network deletion detected; Back-end Port " "%(nsx_id)s creation to be rolled back for Neutron " "port: %(neutron_id)s") % {'nsx_id': lport['uuid'], 'neutron_id': port_data['id']}) LOG.warning(msg) if selected_lswitch and lport: try: switchlib.delete_port(self.cluster, selected_lswitch['uuid'], lport['uuid']) except n_exc.NotFound: LOG.debug(_("NSX Port %s already gone"), lport['uuid'])
def _nsx_create_port(self, context, port_data): """Driver for creating a logical switch port on NSX platform.""" # FIXME(salvatore-orlando): On the NSX platform we do not really have # external networks. So if as user tries and create a "regular" VIF # port on an external network we are unable to actually create. # However, in order to not break unit tests, we need to still create # the DB object and return success # NOTE(rods): Reporting mark's comment on havana version of this patch. # Akanda does want ports for external networks so this method is # basically same with external check removed and the auto plugging of # router ports # --------------------------------------------------------------------- # Note(rods): Remove the check on the external network # # Original code: # if self._network_is_external(context, port_data['network_id']): # LOG.info(_("NSX plugin does not support regular VIF ports on " # "external networks. Port %s will be down."), # port_data['network_id']) # # No need to actually update the DB state - the default is down # return port_data # --------------------------------------------------------------------- lport = None selected_lswitch = None try: selected_lswitch = self._nsx_find_lswitch_for_port( context, port_data) lport = self._nsx_create_port_helper(context.session, selected_lswitch['uuid'], port_data, True) nsx_db.add_neutron_nsx_port_mapping(context.session, port_data['id'], selected_lswitch['uuid'], lport['uuid']) # ----------------------------------------------------------------- # Note(rods): Auto plug router ports # # Original code: # if port_data['device_owner'] not in self.port_special_owners: # switchlib.plug_vif_interface( # self.cluster, selected_lswitch['uuid'], # lport['uuid'], "VifAttachment", port_data['id']) switchlib.plug_vif_interface(self.cluster, selected_lswitch['uuid'], lport['uuid'], "VifAttachment", port_data['id']) # ----------------------------------------------------------------- LOG.debug( _("_nsx_create_port completed for port %(name)s " "on network %(network_id)s. The new port id is " "%(id)s."), port_data) except (api_exc.NsxApiException, n_exc.NeutronException): self._handle_create_port_exception( context, port_data['id'], selected_lswitch and selected_lswitch['uuid'], lport and lport['uuid']) except db_exc.DBError as e: if (port_data['device_owner'] == constants.DEVICE_OWNER_DHCP and isinstance(e.inner_exception, sql_exc.IntegrityError)): msg = (_("Concurrent network deletion detected; Back-end Port " "%(nsx_id)s creation to be rolled back for Neutron " "port: %(neutron_id)s") % { 'nsx_id': lport['uuid'], 'neutron_id': port_data['id'] }) LOG.warning(msg) if selected_lswitch and lport: try: switchlib.delete_port(self.cluster, selected_lswitch['uuid'], lport['uuid']) except n_exc.NotFound: LOG.debug(_("NSX Port %s already gone"), lport['uuid'])