from neutron.db import dhcp_rpc_base
from neutron.db import external_net_db
from neutron.db import l3_rpc_base
+from neutron.db import models_v2
from neutron.db import portbindings_base
from neutron.db import portbindings_db
from neutron.db import quota_db # noqa
super(NECPluginV2, self).delete_port(context, id)
self.notify_security_groups_member_updated(context, port)
+ def delete_ports(self, context, filters):
+ # Note(amotoki): Override the superclass method to avoid
+ # a long transaction over external API calls.
+ # TODO(amotoki): Need to revisit after bug 1282925 is addressed.
+ query = context.session.query(
+ models_v2.Port).enable_eagerloads(False)
+ query = self._apply_filters_to_query(
+ query, models_v2.Port, filters)
+ port_ids = [p['id'] for p in query]
+ for port_id in port_ids:
+ self.delete_port(context, port_id)
+
class NECPluginV2AgentNotifierApi(proxy.RpcProxy,
sg_rpc.SecurityGroupAgentRpcApiMixin):
# See the License for the specific language governing permissions and
# limitations under the License.
+import contextlib
import os
import fixtures
class TestNecPortsV2(test_plugin.TestPortsV2, NecPluginV2TestCase):
- pass
+
+ def test_delete_ports(self):
+ with self.subnet() as subnet:
+ with contextlib.nested(
+ self.port(subnet=subnet, device_owner='test-owner',
+ no_delete=True),
+ self.port(subnet=subnet, device_owner='test-owner',
+ no_delete=True),
+ self.port(subnet=subnet, device_owner='other-owner'),
+ ) as (p1, p2, p3):
+ network_id = subnet['subnet']['network_id']
+ filters = {'network_id': [network_id],
+ 'device_owner': ['test-owner']}
+ self.plugin.delete_ports(self.context, filters)
+
+ self._show('ports', p1['port']['id'],
+ expected_code=webob.exc.HTTPNotFound.code)
+ self._show('ports', p2['port']['id'],
+ expected_code=webob.exc.HTTPNotFound.code)
+ self._show('ports', p3['port']['id'],
+ expected_code=webob.exc.HTTPOk.code)
class TestNecNetworksV2(test_plugin.TestNetworksV2, NecPluginV2TestCase):