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 bbf0cc2 commit 23f855a
Show file tree
Hide file tree
Showing 3 changed files with 112 additions and 14 deletions.
47 changes: 45 additions & 2 deletions api/api/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,18 @@
import time
import mock
import redis
from datetime import timedelta
from django.conf import settings
from django.core.urlresolvers import resolve
from django.test import TestCase, override_settings
from django.utils import timezone
from rest_framework import status
from rest_framework.test import APIRequestFactory

from .common import get_all_registered_nodes, remove_extra_whitespaces, to_json_bools, rsync_dir_with_nodes, get_project_list, get_keystone_admin_auth
from .exceptions import FileSynchronizationException
from .startup import run as startup_run
from .middleware import CrystalMiddleware


# Tests use database=10 instead of 0.
Expand Down Expand Up @@ -163,6 +167,41 @@ def test_urls(self):
self.assertEqual(resolver.view_name, 'swift_api.views.node_detail')
self.assertEqual(resolver.kwargs, {'server_type': 'object', 'node_id': 'node1'})

#
# Crystal Middleware tests
#

def test_middleware_no_token_header(self):
cm = CrystalMiddleware()

request = self.factory.get('/filters')
response = cm.process_request(request)
self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)

@mock.patch('api.middleware.get_keystone_admin_auth')
def test_middleware_with_new_token_ok(self, mock_get_keystone_admin_auth):
# Mock to validate fake token
not_expired_admin_token = FakeTokenData(timezone.now() + timedelta(minutes=5),
[{'name': 'admin'}, {'name': '_member_'}])
mock_get_keystone_admin_auth.return_value.tokens.validate.return_value = not_expired_admin_token

cm = CrystalMiddleware()

request = self.factory.get('/filters')
request.META['HTTP_X_AUTH_TOKEN'] = 'fake_token'
response = cm.process_request(request)
mock_get_keystone_admin_auth.assert_called()
self.assertEqual(response, None)

# Now token is saved in valid_tokens
mock_get_keystone_admin_auth.reset_mock()
request = self.factory.get('/filters')
request.META['HTTP_X_AUTH_TOKEN'] = 'fake_token'
response = cm.process_request(request)
mock_get_keystone_admin_auth.assert_not_called()
self.assertEqual(response, None)


#
# Aux methods
#
Expand Down Expand Up @@ -197,9 +236,13 @@ def create_startup_fixtures(self):


class FakeTokenData:
def __init__(self, expires, user):
def __init__(self, expires, roles):
self.expires = expires
self.user = user
self.roles = roles

def __getitem__(self, i):
if i == 'roles':
return self.roles


class FakeTenantData:
Expand Down
66 changes: 66 additions & 0 deletions api/metrics/tests_actors.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import json
import os

import mock
import redis
from django.conf import settings
from django.test import TestCase, override_settings
from rest_framework import status
from rest_framework.test import APIRequestFactory

from metrics.views import metric_module_list, metric_module_detail, MetricModuleData, list_activated_metrics
from metrics.actors.swift_metric import SwiftMetric


# Tests use database=10 instead of 0.
@override_settings(REDIS_CON_POOL=redis.ConnectionPool(host='localhost', port=6379, db=10),
STORLET_FILTERS_DIR=os.path.join("/tmp", "crystal", "storlet_filters"),
WORKLOAD_METRICS_DIR=os.path.join("/tmp", "crystal", "workload_metrics"),
GLOBAL_CONTROLLERS_DIR=os.path.join("/tmp", "crystal", "global_controllers"))
class MetricsActorsTestCase(TestCase):
def setUp(self):
# Every test needs access to the request factory.
# Using rest_framework's APIRequestFactory: http://www.django-rest-framework.org/api-guide/testing/
self.r = redis.Redis(connection_pool=settings.REDIS_CON_POOL)

self.factory = APIRequestFactory()
self.create_metric_modules()

def tearDown(self):
self.r.flushdb()

#
# Actors
#

@mock.patch('metrics.actors.swift_metric.SwiftMetric._send_data_to_logstash')
@mock.patch('metrics.actors.swift_metric.Thread')
def test_swift_metric(self, mock_thread, mock_send_data_to_logstash):
actor_id = '1'
routing_key = 'metric.' + actor_id
swift_metric = SwiftMetric(actor_id, routing_key)
mock_thread.assert_called()
mock_thread.return_value.start.assert_called()
self.assertEqual(swift_metric.name, actor_id)

body = '{"container": "crystal/data", "metric_name": "bandwidth", "@timestamp": "2017-09-09T18:00:18.331492+02:00", ' \
'"value": 16.4375, "project": "crystal", "host": "controller", "method": "GET", "server_type": "proxy"}'
swift_metric.notify(body)
expected_dict = {'project': 'crystal', 'host': 'controller', 'container': 'crystal/data', 'metric_name': 'bandwidth',
'server_type': 'proxy', '@timestamp': '2017-09-09T18:00:18.331492+02:00', 'method': 'GET', 'value': 16.4375}
mock_send_data_to_logstash.assert_called_with(expected_dict)
self.assertFalse(swift_metric.metrics.empty())
self.assertEqual(swift_metric.metrics.get(), expected_dict)

#
# Aux methods
#

def create_metric_modules(self):
self.r.incr("workload_metrics:id") # setting autoincrement to 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'})

def setup_activated_metrics_data(self):
self.r.hmset('metric:metric1', {'network_location': '?', 'type': 'integer'})
self.r.hmset('metric:metric2', {'network_location': '?', 'type': 'integer'})
13 changes: 1 addition & 12 deletions api/policies/tests_actors.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,6 @@
from actors.rule_transient import TransientRule
from .dsl_parser import parse

# Adding a path to be able to import bandwidth_controller_samples
# sys.path.insert(0, '../')
# from controller.dynamic_policies.metrics.bw_info import BwInfo
# from controller.dynamic_policies.metrics.bw_info_ssync import BwInfoSSYNC
# from controller.dynamic_policies.metrics.swift_metric import SwiftMetric
# from controller_samples.static_bandwidth import StaticBandwidthPerTenant
# from controller_samples.static_replication_bandwidth import StaticReplicationBandwidth
# from controller_samples.min_bandwidth_per_tenant import SimpleMinBandwidthPerTenant
# from controller_samples.min_slo_tenant_global_share_spare_bw import MinTenantSLOGlobalSpareBWShare
# from controller_samples.min_slo_tenant_global_share_spare_bw_v2 import MinTenantSLOGlobalSpareBWShare as MinTenantSLOGlobalSpareBWShareV2


@urlmatch(netloc=r'(.*\.)?example\.com')
def example_mock_200(url, request):
Expand All @@ -36,7 +25,7 @@ def example_mock_400(url, request):
@override_settings(REDIS_CON_POOL=redis.ConnectionPool(host='localhost', port=6379, db=10),
STORLET_FILTERS_DIR=os.path.join("/tmp", "crystal", "storlet_filters"),
WORKLOAD_METRICS_DIR=os.path.join("/tmp", "crystal", "workload_metrics"))
class ActorsTestCase(TestCase):
class PoliciesActorsTestCase(TestCase):

def setUp(self):
self.r = redis.Redis(connection_pool=settings.REDIS_CON_POOL)
Expand Down

0 comments on commit 23f855a

Please sign in to comment.