예제 #1
0
  def test_account_info(self):
      base = Controller(self.app)
      info = base.account_info('a')
 
      info = {'status': '201', 'bytes': '2000', 'container_count': '1000'}
      with patch('osd.proxyService.controllers.base.get_info', return_value=info):
          info = base.account_info('a')
          self.assertEquals(info, ([{'ip': '1.2.3.4', 'port': '0000'}], 'fs1', 'a', 1000))
      
      info = {'status': '201', 'bytes': '2000', 'container_count': None}
      with patch('osd.proxyService.controllers.base.get_info', return_value=info):
          info = base.account_info('a')
          self.assertEquals(info, ([{'ip': '1.2.3.4', 'port': '0000'}], 'fs1', 'a', 0))
예제 #2
0
class TestGlobalMethod(unittest.TestCase):
    def setUp(self):
        self.app = proxy_server.Application(None, FakeMemcache(),
                                            account_ring=FakeAccountRing(''),
                                            container_ring=FakeContainerRing(''),
                                            object_ring=FakeObjectRing(''),
                                            logger=FakeLogger())
        self.base = Controller(self.app)

    def tearDown(self):
        pass

    def test_source_key(self):
        self.assertEquals(source_key(FakeResponse({'test': 'value'}, {}, 'a', 'c', 'o')), 0.0)
        self.assertEquals(source_key(FakeResponse({'x-put-timestamp': '123'}, {}, 'a', 'c', 'o')), 123.0) 
        self.assertEquals(source_key(FakeResponse({'x-timestamp': '1231.0'}, {}, 'a', 'c', 'o')), 1231.0)

    def test_get_account_memcache_key(self):
        self.assertEquals(get_account_memcache_key('test'), 'account/test')
        self.assertEquals(get_account_memcache_key(''), 'account/')
  
    def test_get_container_memcache_key(self):
        self.assertEquals(get_container_memcache_key('test', 'test_cont'), 'container/test/test_cont')
        self.assertRaises(ValueError, get_container_memcache_key, '', '')
        self.assertEquals(get_container_memcache_key('', 'test_cont'), 'container//test_cont')

    def test__prep_headers_to_info(self):
        self.assertEquals(_prep_headers_to_info({'X-Container-Meta-Test': 'Value'}, 'container'), ({}, {'test': 'Value'}, {}))
        self.assertEquals(_prep_headers_to_info({'X-Timestamp': '123'}, 'container'), ({'x-timestamp': '123'}, {}, {}))
        self.assertEquals(_prep_headers_to_info({'X-Timestamp': '123', 'X-Content-Length': 12}, 'object'), \
            ({'x-timestamp': '123', 'x-content-length': 12}, {}, {}))
        self.assertEquals(_prep_headers_to_info({'X-Container-Sysmeta-test': 'value'}, 'container'), \
           ({}, {}, {'test': 'value'}))
        self.assertEquals(_prep_headers_to_info({'X-Container-Sysmeta-test': 'value', 'X-Container-Meta-Test': 'Value', 'X-Content-Length': 12}, \
           'container'), ({'x-content-length': 12}, {'test': 'Value'}, {'test': 'value'}))

    def test__get_cache_key(self):
        self.assertEquals(_get_cache_key('acc', 'cont'), ('container/acc/cont', 'swift.container/acc/cont'))
        self.assertEquals(_get_cache_key('acc', None), ('account/acc', 'swift.account/acc'))

    def test_get_object_env_key(self):
        self.assertEquals(get_object_env_key('a', 'c', 'o'), 'swift.object/a/c/o')

    def test__set_info_cache(self):
        env = {}
        _set_info_cache(self.app, env, 'a', 'c', FakeResponse({'x-container-meta-test': 'value'}, {}, 'a', 'c', None))
        env_expected = {'swift.container/a/c': {'status': 201, 'sync_key': None, 'meta': {'test': 'value'}, 'write_acl': None, 'object_count': None, 'sysmeta': {}, 'bytes': None, 'read_acl': None, 'versions': None}}
        self.assertEquals(env, env_expected)
        env = {}
        _set_info_cache(self.app, env, 'a', None, FakeResponse({'x-account-meta-test': 'value'}, {}, 'a', None, None))
        env_expected = {'swift.account/a': {'status': 201, 'container_count': None, 'bytes': None, 'total_object_count': None, 'meta': {'test': 'value'}, 'sysmeta': {}}}
        self.assertEquals(env, env_expected)

    def test__set_object_info_cache(self):
        env = {}
        _set_object_info_cache(self.app, env, 'a', 'c', 'o', FakeResponse({}, {}, 'a', 'c', 'o'))
        env_expected = {'swift.object/a/c/o': {'status': 201, 'length': None, 'etag': None, 'type': None, 'meta': {}}}
        self.assertEquals(env, env_expected)

    def test__get_info_cache(self):
       env = {'swift.account/test_Account': {'just_a_test': 'empty'}}
       self.assertEquals(_get_info_cache(self.app, env, 'test_Account', None), {'just_a_test': 'empty'})
       env = {'swift.container/a/c': {'just_a_test': 'empty'}}
       self.assertEquals(_get_info_cache(self.app, env, 'a', 'c'), {'just_a_test': 'empty'})
       self.assertEquals(_get_info_cache(self.app, {}, 'test_Account', None), None)

    def test_is_good_source(self):
        req = Request.blank('/')
        handler = GetOrHeadHandler(None, req, 'Object', None, None, None, None, None,
                                   {'Range': 'bytes=-100'})
        self.assertEquals(handler.is_good_source(FakeResponse({}, {}, 'a', 'c', 'o', 416)), True)
        handler = GetOrHeadHandler(None, req, 'Container', None, None, None, None, None,
                                   {'Range': 'bytes=-100'})
        self.assertEquals(handler.is_good_source(FakeResponse({}, {}, 'a', 'c', 'o', 416)), False)
        self.assertEquals(handler.is_good_source(FakeResponse({}, {}, 'a', 'c', 'o', 200)), True)
        self.assertEquals(handler.is_good_source(FakeResponse({}, {}, 'a', 'c', 'o', 311)), True)

    def test__get_source_and_node(self):
        req = Request.blank('/')
        handler = GetOrHeadHandler(self.app, req, 'Object', None, [{'ip': '1.2.3', 'port': '0000'}], None, None, None,
                                   {'Range': 'bytes=-100'})
        with patch('osd.proxyService.controllers.base.'
                   'http_connect', fake_http_connect(side_effect=Exception)):    
            self.assertEquals(handler._get_source_and_node(), (None, None))
        
        with patch('osd.proxyService.controllers.base.'
                   'http_connect', fake_http_connect(200)):
            self.assertEquals(handler._get_source_and_node()[1], {'ip': '1.2.3', 'port': '0000'})
        
        with patch('osd.proxyService.controllers.base.'
                   'http_connect', fake_http_connect(507)):
            self.assertEquals(handler._get_source_and_node(), (None, None))

    def test_get_working_response(self):
        req = Request.blank('/')
        handler = GetOrHeadHandler(self.app, req, 'Object', None, [{'ip': '1.2.3', 'port': '0000'}], None, None, None,
                                   {'Range': 'bytes=-100'})
        with patch('osd.proxyService.controllers.base.'
                   'http_connect', fake_http_connect(side_effect=Exception)):
            self.assertEquals(handler.get_working_response(req), None)
        with patch('osd.proxyService.controllers.base.'
                   'http_connect', fake_http_connect(200)):
            self.assertTrue(handler.get_working_response(req) is not None)
        with patch('osd.proxyService.controllers.base.'
                   'http_connect', fake_http_connect(503)):
            self.assertEquals(handler.get_working_response(req), None)

    def test__x_remove_headers(self):
        self.assertEquals(self.base._x_remove_headers(), [])

    def test_transfer_headers(self):
        dst_headers = {}
        src_headers = {'x-remove-base-meta-key': 'value'}
        self.base.transfer_headers(src_headers, dst_headers)
        self.assertEquals(dst_headers, {'x-base-meta-key': ''})
        dst_headers = {}
        src_headers = {'x-base-sysmeta-key': 'value'}
        self.base.transfer_headers(src_headers, dst_headers)
        self.assertEquals(dst_headers, {'x-base-sysmeta-key': 'value'})

    def test_account_info(self):
        with patch('osd.proxyService.controllers.base.get_info',
                   return_value={'container_count': 2}):
            self.assertEquals(self.base.account_info('a'), ([{'ip': '1.2.3.4', 'port': '0000'}], 'fs1', 'a', 2))
        with patch('osd.proxyService.controllers.base.get_info',
                   return_value={'container_count': None}):
            self.assertEquals(self.base.account_info('a'), ([{'ip': '1.2.3.4', 'port': '0000'}], 'fs1', 'a', 0))
        self.assertEquals(self.base.account_info('a'), (None, None, None, None))

    def test_container_info(self):
       with patch('osd.proxyService.controllers.base.get_info',
                   return_value={'object_count': 2}):
            self.assertEquals(self.base.container_info('a', 'c'), {'node': [{'ip': '1.2.3.4', 'port': '0000'}], 'filesystem': 'fs1', \
                'directory': 'a1', 'object_count': 2})
       with patch('osd.proxyService.controllers.base.get_info',
                   return_value=None):
            self.assertEquals(self.base.container_info('a', 'c'), {'status': 0, 'sync_key': None, 'node': None, 'meta': {}, \
               'sysmeta': {}, 'read_acl': None, 'object_count': None, 'write_acl': None, 'bytes': None, 'filesystem': None, 'directory': None, 'versions': None})
    
    def test_make_requests(self):
        req = Request.blank('/v1/a/c/o') 
        with patch('osd.proxyService.controllers.base.'
                   'http_connect', side_effect=Exception):
            resp = self.base.make_requests(req, FakeObjectRing(''), [{'ip': '1.2.3.4', 'port': '0000'}], 'fs1', \
                'd1', 'HEAD', '/a/c/o', {'test': 'value'})
            self.assertEqual(resp.status, '503 Internal Server Error')
        with patch('osd.proxyService.controllers.base.'
                   'http_connect', fake_http_connect(200)):
            resp = self.base.make_requests(req, FakeObjectRing(''), [{'ip': '1.2.3.4', 'port': '0000'}], 'fs1', \
                'd1', 'HEAD', '/a/c/o', {'test': 'value'})
            self.assertEqual(resp.status.split()[0], '200')

    def test_best_response(self):
        req = Request.blank('/v1/a/c/o')
        resp = self.base.best_response(req, [], [], [], 'object')
        self.assertEqual(resp.status, '503 Internal Server Error')
  
        req = Request.blank('/v1/a/c/o')
        resp = self.base.best_response(req, [200], ['Fake'], [''], 'object', {})
        self.assertEqual(resp.status, '200 Fake')
    
        req = Request.blank('/v1/a/c/o')
        resp = self.base.best_response(req, [412], ['Fake'], [''], 'object', {})
        self.assertEqual(resp.status, '412 Fake')

        req = Request.blank('/v1/a/c/o')
        resp = self.base.best_response(req, [500], ['Fake'], [''], 'object', {})
        self.assertEqual(resp.status, '503 Internal Server Error')

    def test_autocreate_account(self):
       with patch('osd.proxyService.controllers.base.'
                   'http_connect', side_effect=Exception):
           clear_info_cache = MagicMock()
           self.base.autocreate_account({}, 'a')
           self.assertFalse(clear_info_cache.called)
       
       with patch('osd.proxyService.controllers.base.'
                   'http_connect', fake_http_connect(503)):
           clear_info_cache = MagicMock()
           self.base.autocreate_account({}, 'a')
           self.assertFalse(clear_info_cache.called)

    def test_autocreate_account_success_case(self):
       with patch('osd.proxyService.controllers.base.'
                   'http_connect', fake_http_connect(200)):
           clear_info_cache = MagicMock()
           self.base.autocreate_account({}, 'a')
           #self.assertTrue(clear_info_cache.called)
           #clear_info_cache.assert_called_once_with(self.app, {}, 'a')

    def test_add_component_in_block_req(self):
        base = Controller(self.app)
        self.base.add_component_in_block_req('Account', 'X1')
        self.assertEqual(self.base.block_req_dict, {('Account', 'X1'): True})
        self.base.add_component_in_block_req('Account', 'X2')
        self.assertEqual(self.base.block_req_dict, {('Account', 'X1'): True, ('Account', 'X2'): True})

    def test_delete_component_from_block_req(self):
        base = Controller(self.app)
        #self.base.block_req_dict = MagicMock({('1.2.3.4', '0000'): True, ('1.2.3.4', '1111'): False})
        self.base.add_component_in_block_req('Account', 'X1')
        self.base.add_component_in_block_req('Account', 'X2')
        self.base.delete_component_from_block_req('Account', 'X1')
        self.assertEqual(self.base.block_req_dict, {('Account', 'X2'): True})

    def test_is_req_blocked_without_component(self):
        base = Controller(self.app)
        self.assertFalse(self.base.is_req_blocked('Account', 'X1'))

    def test_is_req_blocked_with_component(self):
        self.base.add_component_in_block_req('Account', 'X1')
        self.assertTrue(self.base.is_req_blocked('Account', 'X1'))
        self.assertFalse(self.base.is_req_blocked('', ''))
        self.base.add_component_in_block_req('Account', 'X2')
        self.assertTrue(self.base.is_req_blocked('Account', 'X2'))
        self.base.add_component_in_block_req('Account', 'X3')
        self.assertTrue(self.base.is_req_blocked('Account', 'X3'))
        self.assertFalse(self.base.is_req_blocked('Account', 'X5'))

    def test_update_map_for_account(self):
        pass