|
|
|
@ -16,6 +16,7 @@
|
|
|
|
|
import mock |
|
|
|
|
from neutron_lib import constants as const |
|
|
|
|
from neutron_lib import context |
|
|
|
|
from neutron_lib.db import api as n_db_api |
|
|
|
|
from neutron_lib.services.logapi import constants as log_const |
|
|
|
|
from neutron_lib.utils import net as net_utils |
|
|
|
|
from oslo_utils import uuidutils |
|
|
|
@ -27,21 +28,24 @@ from neutron.services.logapi.rpc import server as server_rpc
|
|
|
|
|
from neutron.tests.unit.extensions import test_securitygroup as test_sg |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _create_log(tenant_id, resource_id=None, |
|
|
|
|
def _create_log(context, project_id, resource_id=None, |
|
|
|
|
target_id=None, event='ALL', enabled=True,): |
|
|
|
|
|
|
|
|
|
log_data = { |
|
|
|
|
'id': uuidutils.generate_uuid(), |
|
|
|
|
'name': 'test', |
|
|
|
|
'resource_type': 'security_group', |
|
|
|
|
'project_id': tenant_id, |
|
|
|
|
'project_id': project_id, |
|
|
|
|
'event': event, |
|
|
|
|
'enabled': enabled} |
|
|
|
|
if resource_id: |
|
|
|
|
log_data['resource_id'] = resource_id |
|
|
|
|
if target_id: |
|
|
|
|
log_data['target_id'] = target_id |
|
|
|
|
return log_object.Log(**log_data) |
|
|
|
|
with n_db_api.CONTEXT_WRITER.using(context): |
|
|
|
|
_log_obj = log_object.Log(context, **log_data) |
|
|
|
|
_log_obj.create() |
|
|
|
|
return _log_obj |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class LoggingDBApiTestCase(test_sg.SecurityGroupDBTestCase): |
|
|
|
@ -49,8 +53,8 @@ class LoggingDBApiTestCase(test_sg.SecurityGroupDBTestCase):
|
|
|
|
|
def setUp(self): |
|
|
|
|
super(LoggingDBApiTestCase, self).setUp() |
|
|
|
|
self.context = context.get_admin_context() |
|
|
|
|
self.sg_id, self.port_id, self.tenant_id = self._create_sg_and_port() |
|
|
|
|
self.context.tenant_id = self.tenant_id |
|
|
|
|
self.sg_id, self.port_id, self._tenant_id = self._create_sg_and_port() |
|
|
|
|
self.context.tenant_id = self._tenant_id |
|
|
|
|
|
|
|
|
|
def _create_sg_and_port(self): |
|
|
|
|
with self.network() as network, \ |
|
|
|
@ -67,45 +71,66 @@ class LoggingDBApiTestCase(test_sg.SecurityGroupDBTestCase):
|
|
|
|
|
return sg_id, port_id, tenant_id |
|
|
|
|
|
|
|
|
|
def test_get_logs_bound_port(self): |
|
|
|
|
log = _create_log(target_id=self.port_id, tenant_id=self.tenant_id) |
|
|
|
|
log = _create_log(self.context, self._tenant_id, |
|
|
|
|
target_id=self.port_id) |
|
|
|
|
with mock.patch.object(log_object.Log, 'get_objects', |
|
|
|
|
return_value=[log]): |
|
|
|
|
self.assertEqual( |
|
|
|
|
[log], db_api.get_logs_bound_port(self.context, self.port_id)) |
|
|
|
|
|
|
|
|
|
# Test get log objects with required resource type |
|
|
|
|
calls = [mock.call(self.context, project_id=self.tenant_id, |
|
|
|
|
calls = [mock.call(self.context, project_id=self._tenant_id, |
|
|
|
|
resource_type=log_const.SECURITY_GROUP, |
|
|
|
|
enabled=True)] |
|
|
|
|
log_object.Log.get_objects.assert_has_calls(calls) |
|
|
|
|
|
|
|
|
|
def test_get_logs_not_bound_port(self): |
|
|
|
|
fake_sg_id = uuidutils.generate_uuid() |
|
|
|
|
log = _create_log(resource_id=fake_sg_id, tenant_id=self.tenant_id) |
|
|
|
|
log = _create_log(self.context, self._tenant_id, |
|
|
|
|
resource_id=fake_sg_id) |
|
|
|
|
with mock.patch.object(log_object.Log, 'get_objects', |
|
|
|
|
return_value=[log]): |
|
|
|
|
self.assertEqual( |
|
|
|
|
[], db_api.get_logs_bound_port(self.context, self.port_id)) |
|
|
|
|
|
|
|
|
|
# Test get log objects with required resource type |
|
|
|
|
calls = [mock.call(self.context, project_id=self.tenant_id, |
|
|
|
|
calls = [mock.call(self.context, project_id=self._tenant_id, |
|
|
|
|
resource_type=log_const.SECURITY_GROUP, |
|
|
|
|
enabled=True)] |
|
|
|
|
log_object.Log.get_objects.assert_has_calls(calls) |
|
|
|
|
|
|
|
|
|
def test_get_logs_bound_sg(self): |
|
|
|
|
log = _create_log(resource_id=self.sg_id, tenant_id=self.tenant_id) |
|
|
|
|
with mock.patch.object(log_object.Log, 'get_objects', |
|
|
|
|
return_value=[log]): |
|
|
|
|
self.assertEqual( |
|
|
|
|
[log], db_api.get_logs_bound_sg( |
|
|
|
|
self.context, self.sg_id, project_id=self.tenant_id)) |
|
|
|
|
with self.network() as network, \ |
|
|
|
|
self.subnet(network=network) as subnet, \ |
|
|
|
|
self.port(subnet=subnet) as p1, \ |
|
|
|
|
self.port(subnet=subnet, security_groups=[self.sg_id]) as p2: |
|
|
|
|
|
|
|
|
|
# Test get log objects with required resource type |
|
|
|
|
calls = [mock.call(self.context, project_id=self.tenant_id, |
|
|
|
|
resource_type=log_const.SECURITY_GROUP, |
|
|
|
|
enabled=True)] |
|
|
|
|
log_object.Log.get_objects.assert_has_calls(calls) |
|
|
|
|
log = _create_log(self.context, self._tenant_id) |
|
|
|
|
log_sg = _create_log(self.context, self._tenant_id, |
|
|
|
|
resource_id=self.sg_id) |
|
|
|
|
log_port_no_sg = _create_log(self.context, self._tenant_id, |
|
|
|
|
target_id=p1['port']['id']) |
|
|
|
|
log_port_sg = _create_log(self.context, self._tenant_id, |
|
|
|
|
target_id=p2['port']['id']) |
|
|
|
|
self.assertEqual( |
|
|
|
|
[log, log_sg, log_port_sg], |
|
|
|
|
db_api.get_logs_bound_sg(self.context, sg_id=self.sg_id, |
|
|
|
|
project_id=self._tenant_id)) |
|
|
|
|
self.assertEqual( |
|
|
|
|
[log_sg, log_port_sg], |
|
|
|
|
db_api.get_logs_bound_sg(self.context, sg_id=self.sg_id, |
|
|
|
|
project_id=self._tenant_id, |
|
|
|
|
exclusive=True)) |
|
|
|
|
self.assertEqual( |
|
|
|
|
[log_port_no_sg], |
|
|
|
|
db_api.get_logs_bound_sg( |
|
|
|
|
self.context, project_id=self._tenant_id, |
|
|
|
|
port_id=p1['port']['id'])) |
|
|
|
|
self.assertEqual( |
|
|
|
|
[log_port_sg], |
|
|
|
|
db_api.get_logs_bound_sg( |
|
|
|
|
self.context, project_id=self._tenant_id, |
|
|
|
|
port_id=p2['port']['id'])) |
|
|
|
|
|
|
|
|
|
def test_get_logs_not_bound_sg(self): |
|
|
|
|
with self.network() as network, \ |
|
|
|
@ -116,28 +141,28 @@ class LoggingDBApiTestCase(test_sg.SecurityGroupDBTestCase):
|
|
|
|
|
self.fmt, network['network']['id'], |
|
|
|
|
security_groups=[sg2_id]) |
|
|
|
|
port2_id = self.deserialize(self.fmt, res)['port']['id'] |
|
|
|
|
log = _create_log(target_id=port2_id, tenant_id=self.tenant_id) |
|
|
|
|
log = _create_log(self.context, self._tenant_id, |
|
|
|
|
target_id=port2_id) |
|
|
|
|
with mock.patch.object(log_object.Log, 'get_objects', |
|
|
|
|
return_value=[log]): |
|
|
|
|
self.assertEqual( |
|
|
|
|
[], db_api.get_logs_bound_sg( |
|
|
|
|
self.context, self.sg_id, project_id=self.tenant_id)) |
|
|
|
|
self.context, self.sg_id, project_id=self._tenant_id)) |
|
|
|
|
|
|
|
|
|
# Test get log objects with required resource type |
|
|
|
|
calls = [mock.call(self.context, project_id=self.tenant_id, |
|
|
|
|
calls = [mock.call(self.context, project_id=self._tenant_id, |
|
|
|
|
resource_type=log_const.SECURITY_GROUP, |
|
|
|
|
enabled=True)] |
|
|
|
|
log_object.Log.get_objects.assert_has_calls(calls) |
|
|
|
|
|
|
|
|
|
def test__get_ports_being_logged(self): |
|
|
|
|
log1 = _create_log(target_id=self.port_id, |
|
|
|
|
tenant_id=self.tenant_id) |
|
|
|
|
log2 = _create_log(resource_id=self.sg_id, |
|
|
|
|
tenant_id=self.tenant_id) |
|
|
|
|
log3 = _create_log(target_id=self.port_id, |
|
|
|
|
resource_id=self.tenant_id, |
|
|
|
|
tenant_id=self.tenant_id) |
|
|
|
|
log4 = _create_log(tenant_id=self.tenant_id) |
|
|
|
|
log1 = _create_log(self.context, self._tenant_id, |
|
|
|
|
target_id=self.port_id) |
|
|
|
|
log2 = _create_log(self.context, self._tenant_id, |
|
|
|
|
resource_id=self.sg_id) |
|
|
|
|
log3 = _create_log(self.context, self._tenant_id, |
|
|
|
|
target_id=self.port_id, resource_id=self.sg_id) |
|
|
|
|
log4 = _create_log(self.context, self._tenant_id) |
|
|
|
|
with mock.patch.object( |
|
|
|
|
validators, 'validate_log_type_for_port', return_value=True): |
|
|
|
|
ports_log1 = db_api._get_ports_being_logged(self.context, log1) |
|
|
|
@ -151,7 +176,7 @@ class LoggingDBApiTestCase(test_sg.SecurityGroupDBTestCase):
|
|
|
|
|
self.assertEqual([self.port_id], ports_log4) |
|
|
|
|
|
|
|
|
|
def test__get_ports_being_logged_not_supported_log_type(self): |
|
|
|
|
log = _create_log(tenant_id=self.tenant_id) |
|
|
|
|
log = _create_log(self.context, self._tenant_id) |
|
|
|
|
with mock.patch.object( |
|
|
|
|
validators, 'validate_log_type_for_port', return_value=False): |
|
|
|
|
ports_log = db_api._get_ports_being_logged(self.context, log) |
|
|
|
@ -189,7 +214,7 @@ class LoggingRpcCallbackTestCase(test_sg.SecurityGroupDBTestCase):
|
|
|
|
|
security_groups=[sg_id]) |
|
|
|
|
ports_rest = self.deserialize(self.fmt, res) |
|
|
|
|
port_id = ports_rest['port']['id'] |
|
|
|
|
log = _create_log(resource_id=sg_id, tenant_id=tenant_id) |
|
|
|
|
log = _create_log(self.context, self._tenant_id, resource_id=sg_id) |
|
|
|
|
with mock.patch.object( |
|
|
|
|
server_rpc, |
|
|
|
|
'get_rpc_method', |
|
|
|
@ -261,7 +286,7 @@ class LoggingRpcCallbackTestCase(test_sg.SecurityGroupDBTestCase):
|
|
|
|
|
) |
|
|
|
|
ports_rest = self.deserialize(self.fmt, res) |
|
|
|
|
port_id = ports_rest['port']['id'] |
|
|
|
|
log = _create_log(tenant_id=tenant_id) |
|
|
|
|
log = _create_log(self.context, tenant_id) |
|
|
|
|
with mock.patch.object( |
|
|
|
|
log_object.Log, 'get_objects', return_value=[log]): |
|
|
|
|
with mock.patch.object( |
|
|
|
|