Skip to content

Commit

Permalink
Added tests
Browse files Browse the repository at this point in the history
  • Loading branch information
gerardparis committed Nov 14, 2017
1 parent 29923a2 commit ba2ecc9
Show file tree
Hide file tree
Showing 6 changed files with 199 additions and 48 deletions.
37 changes: 0 additions & 37 deletions api/filters/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -246,43 +246,6 @@ def test_filter_deploy_to_project_and_container_ok(self, mock_put_object):
json_data = json.loads(dumped_data)
self.assertEqual(json_data["filter_name"], "test-1.0.jar")

# def _test_storlet_undeploy_for_non_existent_storlet(self):
# # Filter 2 does not exist
# request = self.factory.put('/filters/0123456789abcdef/undeploy/2')
# response = storlet_undeploy(request, '2', '0123456789abcdef')
# self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
#
# def _test_storlet_undeploy_for_non_deployed_storlet_and_project(self):
# request = self.factory.put('/filters/0123456789abcdef/undeploy/1')
# response = storlet_undeploy(request, '1', '0123456789abcdef')
# self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)

# @mock.patch('filters.views.swift_client.put_object', side_effect=mock_put_object_status_created)
# def test_storlet_undeploy_without_auth_token(self, mock_put_object):
# # Upload a filter for the storlet 1
# with open('test_data/test-1.0.jar', 'r') as fp:
# request = self.factory.put('/filters/1/data', {'file': fp})
# response = StorletData.as_view()(request, 1)
#
# # Call filter_deploy
# request = self.factory.put('/filters/0123456789abcdef/deploy/1', {"policy_id": "1"}, format='json')
# request.META['HTTP_X_AUTH_TOKEN'] = 'fake_token'
# response = filter_deploy(request, "1", "0123456789abcdef")
# self.assertEqual(response.status_code, status.HTTP_201_CREATED)
# mock_put_object.assert_called_with(settings.SWIFT_URL + "/AUTH_0123456789abcdef",
# 'fake_token', ".storlet", "FakeFilter", mock.ANY, mock.ANY, mock.ANY,
# mock.ANY, mock.ANY, mock.ANY, mock.ANY, mock.ANY, mock.ANY, mock.ANY)
# self.assertTrue(self.r.hexists("pipeline:0123456789abcdef", "1"))
# dumped_data = self.r.hget("pipeline:0123456789abcdef", "1")
# json_data = json.loads(dumped_data)
# self.assertEqual(json_data["filter_name"], "FakeFilter")
#
# # Try to undeploy without auth token
# request = self.factory.put('/filters/0123456789abcdef/undeploy/1')
# response = storlet_undeploy(request, "1", "0123456789abcdef")
# print response
# self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)

def test_get_all_dependencies_ok(self):
request = self.factory.get('/filters/dependencies')
response = dependency_list(request)
Expand Down
50 changes: 48 additions & 2 deletions api/metrics/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from rest_framework import status
from rest_framework.test import APIRequestFactory

from metrics.views import metric_module_list, metric_module_detail, MetricModuleData
from metrics.views import metric_module_list, metric_module_detail, MetricModuleData, list_activated_metrics


# Tests use database=10 instead of 0.
Expand Down Expand Up @@ -115,6 +115,48 @@ def test_create_metric_module_ok(self, mock_rsync_dir):
metric_data = json.loads(response.content)
self.assertEqual(metric_data['metric_name'], 'test.py')

@mock.patch('metrics.views.rsync_dir_with_nodes')
def test_update_metric_module_put_ok(self, mock_rsync_dir):
metric_id = '1'
with open('test_data/test.py', 'r') as fp:
request = self.factory.put('/metrics/' + metric_id + '/data', {'file': fp})
response = MetricModuleData.as_view()(request, metric_id)
mock_rsync_dir.assert_called_with(settings.WORKLOAD_METRICS_DIR)

self.assertEqual(response.status_code, status.HTTP_201_CREATED)

# check the metric module has been updated
request = self.factory.get('/metrics/' + metric_id)
response = metric_module_detail(request, metric_id)
self.assertEqual(response.status_code, status.HTTP_200_OK)
metric_data = json.loads(response.content)
self.assertEqual(metric_data['metric_name'], 'test.py')

@mock.patch('metrics.views.os.path.join')
def test_download_metric_module_get_ok(self, mock_os_path_join):
mock_os_path_join.return_value = 'test_data/test.py'
metric_id = '1'

request = self.factory.get('/metrics/' + metric_id + '/data')
response = MetricModuleData.as_view()(request, metric_id)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response['Content-Length'], '11')
self.assertEqual(response['Content-Disposition'], 'attachment; filename=test.py')

def test_download_metric_module_not_found(self):
metric_id = '1'
request = self.factory.get('/metrics/' + metric_id + '/data')
response = MetricModuleData.as_view()(request, metric_id)
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)

def test_list_activated_metrics(self):
self.setup_activated_metrics_data()
request = self.factory.get('/metrics/activated')
response = list_activated_metrics(request)
self.assertEqual(response.status_code, status.HTTP_200_OK)
metrics_data = json.loads(response.content)
self.assertEqual(len(metrics_data), 2)

#
# Aux methods
#
Expand All @@ -124,4 +166,8 @@ def create_metric_modules(self):
# self.r.hmset('workload_metric:1', {'metric_name': 'm1.py', 'class_name': 'Metric1', 'execution_server': 'proxy', 'out_flow': 'False',
# 'in_flow': 'False', 'status': 'Running', 'id': '1'})
self.r.hmset('workload_metric:1', {'metric_name': 'm1.py', 'class_name': 'Metric1', 'status': 'Running', 'get': 'False', 'put': 'False',
'execution_server': 'object', 'replicate': 'True', 'ssync': 'True', 'id': '1'})
'execution_server': 'object', 'replicate': 'True', 'ssync': 'True', 'id': '1'})

def setup_activated_metrics_data(self):
self.r.hmset('metric:metric1', {'network_location': '?', 'type': 'integer'})
self.r.hmset('metric:metric2', {'network_location': '?', 'type': 'integer'})
6 changes: 3 additions & 3 deletions api/metrics/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ def list_activated_metrics(request):
try:
r = get_redis_connection()
except RedisError:
return JSONResponse('Error connecting with DB', status=500)
return JSONResponse('Error connecting with DB', status=status.HTTP_500_INTERNAL_SERVER_ERROR)

if request.method == 'GET':
keys = r.keys("metric:*")
Expand All @@ -46,9 +46,9 @@ def list_activated_metrics(request):
metric = r.hgetall(key)
metric["name"] = key.split(":")[1]
metrics.append(metric)
return JSONResponse(metrics, status=200)
return JSONResponse(metrics, status=status.HTTP_200_OK)

return JSONResponse('Method ' + str(request.method) + ' not allowed.', status=405)
return JSONResponse('Method ' + str(request.method) + ' not allowed.', status=status.HTTP_405_METHOD_NOT_ALLOWED)


#
Expand Down
102 changes: 101 additions & 1 deletion api/policies/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
from rest_framework.test import APIRequestFactory
from policies.dsl_parser import parse, parse_condition
from filters.views import filter_list, filter_deploy, FilterData
from policies.views import object_type_list, object_type_detail, static_policy_detail, dynamic_policy_detail, policy_list
from policies.views import object_type_list, object_type_detail, static_policy_detail, dynamic_policy_detail, policy_list, \
access_control, access_control_detail
from projects.views import add_projects_group


Expand All @@ -35,6 +36,7 @@ def setUp(self):
self.create_storage_nodes()
self.create_metric_modules()
self.create_global_controllers()
self.create_acls()

def tearDown(self):
self.r.flushdb()
Expand Down Expand Up @@ -534,6 +536,99 @@ def test_update_object_type_with_empty_list(self):
response = object_type_detail(request, name)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

#
# ACL's
#

@mock.patch('policies.views.get_project_list')
def test_access_control_get_ok(self, mock_get_project_list):
mock_get_project_list.return_value = {'0123456789abcdef': 'tenantA', 'abcdef0123456789': 'tenantB'}

request = self.factory.get('/policies/acl/')
response = access_control(request)
self.assertEqual(response.status_code, status.HTTP_200_OK)
acls = json.loads(response.content)
self.assertEqual(len(acls), 1)
acl = acls[0]
self.assertEqual(acl['user_id'], 'a1a1a1a1a1a1')
self.assertEqual(acl['target_name'], 'tenantA/container1')
self.assertEqual(acl['target_id'], '0123456789abcdef:container1')
self.assertEqual(acl['write'], True)
self.assertEqual(acl['read'], True)
self.assertEqual(acl['id'], '1')

@mock.patch('policies.views.get_project_list')
def test_access_control_post_list_ok(self, mock_get_project_list):
mock_get_project_list.return_value = {'0123456789abcdef': 'tenantA', 'abcdef0123456789': 'tenantB'}

acl_data = {'project_id': '0123456789abcdef', 'container_id': 'container2', 'identity': 'user_id:a1a1a1a1a1a1', 'access': 'list'}
request = self.factory.post('/policies/acl/', acl_data, format='json')
response = access_control(request)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)

# check it has been created
request = self.factory.get('/policies/acl/')
response = access_control(request)
self.assertEqual(response.status_code, status.HTTP_200_OK)
acls = json.loads(response.content)
self.assertEqual(len(acls), 2)

@mock.patch('policies.views.get_project_list')
def test_access_control_post_read_group_ok(self, mock_get_project_list):
mock_get_project_list.return_value = {'0123456789abcdef': 'tenantA', 'abcdef0123456789': 'tenantB'}

acl_data = {'project_id': '0123456789abcdef', 'container_id': 'container2', 'identity': 'group_id:g2g2g2', 'access': 'read'}
request = self.factory.post('/policies/acl/', acl_data, format='json')
response = access_control(request)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)

# check it has been created
policy_id = '0123456789abcdef:container2:2'
request = self.factory.get('/policies/acl/' + policy_id)
response = access_control_detail(request, policy_id)
self.assertEqual(response.status_code, status.HTTP_200_OK)
acl_policy = json.loads(response.content)
self.assertEqual(acl_policy['target_name'], 'tenantA/container2')
self.assertFalse(acl_policy['list'])
self.assertFalse(acl_policy['write'])
self.assertTrue(acl_policy['read'])
self.assertEqual(acl_policy['group_id'], 'g2g2g2')

@mock.patch('policies.views.get_project_list')
def test_access_control_delete_ok(self, mock_get_project_list):
mock_get_project_list.return_value = {'0123456789abcdef': 'tenantA', 'abcdef0123456789': 'tenantB'}

policy_id = '0123456789abcdef:container1:1'
request = self.factory.delete('/policies/acl/' + policy_id)
response = access_control_detail(request, policy_id)
self.assertEqual(response.status_code, status.HTTP_200_OK)

# check it has been deleted
request = self.factory.get('/policies/acl/')
response = access_control(request)
self.assertEqual(response.status_code, status.HTTP_200_OK)
acls = json.loads(response.content)
self.assertEqual(len(acls), 0)

@mock.patch('policies.views.get_project_list')
def test_access_control_update_ok(self, mock_get_project_list):
mock_get_project_list.return_value = {'0123456789abcdef': 'tenantA', 'abcdef0123456789': 'tenantB'}

policy_id = '0123456789abcdef:container1:1'
acl_data = {'access': 'list'}
request = self.factory.put('/policies/acl/' + policy_id, acl_data, format='json')
response = access_control_detail(request, policy_id)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)

# check it has been updated
request = self.factory.get('/policies/acl/' + policy_id)
response = access_control_detail(request, policy_id)
self.assertEqual(response.status_code, status.HTTP_200_OK)
acl_policy = json.loads(response.content)
self.assertTrue(acl_policy['list'])
self.assertFalse(acl_policy['write'])
self.assertFalse(acl_policy['read'])

#
# Aux methods
#
Expand Down Expand Up @@ -625,3 +720,8 @@ def create_global_controllers(self):
'controller_name': 'min_slo_tenant_global_share_spare_bw_v2.py',
'valid_parameters': 'method={put|get}', 'id': '1', 'instances': 0,
'enabled': 'False', 'description': 'Fake description'})

def create_acls(self):
self.r.incr('acls:id')
acl_data = {'user_id': 'a1a1a1a1a1a1', 'read': True, 'object_type': '', 'write': True, 'object_tag': ''}
self.r.hmset('acl:0123456789abcdef:container1', {'1': json.dumps(acl_data)})
2 changes: 1 addition & 1 deletion api/policies/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -563,7 +563,7 @@ def access_control(request):
@csrf_exempt
def access_control_detail(request, policy_id):
"""
Delete a access control.
Get or delete an access control.
"""
try:
r = get_redis_connection()
Expand Down
50 changes: 46 additions & 4 deletions api/swift_api/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
from rest_framework import status
from rest_framework.test import APIRequestFactory

from swift_api.views import storage_policies, locality_list, node_list, node_detail, regions
from swift_api.views import storage_policies, storage_policy_detail, storage_policy_disks, locality_list, node_list, node_detail, \
regions


# Tests use database=10 instead of 0.
Expand All @@ -28,6 +29,10 @@ def setUp(self):
def tearDown(self):
self.r.flushdb()

#
# Storage Policies
#

def test_storage_policies_with_method_not_allowed(self):
""" Test that PUT requests to storage_policies() return METHOD_NOT_ALLOWED """

Expand All @@ -50,6 +55,45 @@ def test_storage_policy_list_ok(self):
storage_policies_json = json.loads(response.content)
self.assertEqual(len(storage_policies_json), 5)

@mock.patch('swift_api.views.RingBuilder')
def test_storage_policies_post_ok(self, mock_ring_builder):
data = {'partition_power': '5', 'replicas': '3', 'time': '10'}
request = self.api_factory.post('/swift/storage_policies', data, format='json')
response = storage_policies(request)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
mock_ring_builder.assert_called_with(5, 3, 10)
mock_ring_builder.return_value.save.assert_called_with('/opt/crystal/swift/tmp/object-1.builder')

def test_storage_policy_detail_get_ok(self):
sp_id = '1'
request = self.api_factory.get('/swift/storage_policy/' + sp_id)
response = storage_policy_detail(request, sp_id)
self.assertEqual(response.status_code, status.HTTP_200_OK)
policy_data = json.loads(response.content)
self.assertEqual(policy_data['storage_policy_id'], sp_id)
self.assertEqual(len(policy_data['devices']), 2)

def test_storage_policy_disks_get_ok(self):
sp_id = '1'
request = self.api_factory.get('/swift/storage_policy/' + sp_id + '/disk')
response = storage_policy_disks(request, sp_id)
self.assertEqual(response.status_code, status.HTTP_200_OK)
available_devices = json.loads(response.content)
self.assertEqual(available_devices, [])

@mock.patch('swift_api.views.RingBuilder.load')
def test_storage_policy_disks_add_disk_ok(self, mock_ring_builder_load):
mock_ring_builder_load.return_value.add_dev.return_value = '10'
sp_id = '1'
disk_data = "storagenode1:sdb2"
request = self.api_factory.put('/swift/storage_policy/' + sp_id + '/disk', disk_data, format='json')
response = storage_policy_disks(request, sp_id)
self.assertEqual(response.status_code, status.HTTP_200_OK)
mock_ring_builder_load.assert_called_with('/opt/crystal/swift/tmp/object-1.builder')
expected_dict = {'weight': 100, 'zone': 'Rack', 'ip': '192.168.2.2', 'region': 'data_center', 'device': 'sdb2', 'port': '6000'}
mock_ring_builder_load.return_value.add_dev.assert_called_with(expected_dict)
mock_ring_builder_load.return_value.save.assert_called_with('/opt/crystal/swift/tmp/object-1.builder')

#
# Nodes
#
Expand Down Expand Up @@ -143,8 +187,6 @@ def test_put_node_detail_ok(self, mock_ssh_client):
self.assertEqual(node['ssh_access'], 'True')
self.assertEqual(node['ssh_username'], 'admin')



# Regions / Zones

def test_regions_get_ok(self):
Expand All @@ -160,7 +202,7 @@ def test_regions_get_ok(self):
#

def create_storage_policies(self):
devices = ["storagenode1:sdb1", "storagenode2:sdb1"]
devices = [["storagenode1:sdb1"], ["storagenode2:sdb1"]]
self.r.hmset("storage-policy:0", {'name': 'allnodes', 'default': 'yes', 'policy_type': 'replication',
'devices': json.dumps(devices)})
self.r.hmset("storage-policy:1", {'name': 'storage4', 'default': 'no', 'policy_type': 'replication',
Expand Down

0 comments on commit ba2ecc9

Please sign in to comment.