예제 #1
0
    def test_best_response_overrides(self):
        base = Controller(self.app)
        responses = [
            (302, 'Found', '', 'The resource has moved temporarily.'),
            (100, 'Continue', '', ''),
            (404, 'Not Found', '', 'Custom body'),
        ]
        server_type = "Base DELETE"
        req = Request.blank('/v1/a/c/o', method='DELETE')
        statuses, reasons, headers, bodies = zip(*responses)

        # First test that you can't make a quorum with only overridden
        # responses
        overrides = {302: 204, 100: 204}
        resp = base.best_response(req, statuses, reasons, bodies, server_type,
                                  headers=headers, overrides=overrides)
        self.assertEqual(resp.status, '503 Internal Server Error')

        # next make a 404 quorum and make sure the last delete (real) 404
        # status is the one returned.
        overrides = {100: 404}
        resp = base.best_response(req, statuses, reasons, bodies, server_type,
                                  headers=headers, overrides=overrides)
        self.assertEqual(resp.status, '404 Not Found')
        self.assertEqual(resp.body, 'Custom body')
예제 #2
0
    def test_GETorHEAD_base(self):
        base = Controller(self.app)
        req = Request.blank('/v1/a/c/o/with/slashes')
        ring = FakeRing()
        nodes = list(ring.get_part_nodes(0)) + list(ring.get_more_nodes(0))
        with patch('swift.proxy.controllers.base.'
                   'http_connect', fake_http_connect(200)):
            resp = base.GETorHEAD_base(req, 'object', iter(nodes), 'part',
                                       '/a/c/o/with/slashes')
        self.assertTrue('swift.object/a/c/o/with/slashes' in resp.environ)
        self.assertEqual(
            resp.environ['swift.object/a/c/o/with/slashes']['status'], 200)
        req = Request.blank('/v1/a/c/o')
        with patch('swift.proxy.controllers.base.'
                   'http_connect', fake_http_connect(200)):
            resp = base.GETorHEAD_base(req, 'object', iter(nodes), 'part',
                                       '/a/c/o')
        self.assertTrue('swift.object/a/c/o' in resp.environ)
        self.assertEqual(resp.environ['swift.object/a/c/o']['status'], 200)
        req = Request.blank('/v1/a/c')
        with patch('swift.proxy.controllers.base.'
                   'http_connect', fake_http_connect(200)):
            resp = base.GETorHEAD_base(req, 'container', iter(nodes), 'part',
                                       '/a/c')
        self.assertTrue('swift.container/a/c' in resp.environ)
        self.assertEqual(resp.environ['swift.container/a/c']['status'], 200)

        req = Request.blank('/v1/a')
        with patch('swift.proxy.controllers.base.'
                   'http_connect', fake_http_connect(200)):
            resp = base.GETorHEAD_base(req, 'account', iter(nodes), 'part',
                                       '/a')
        self.assertTrue('swift.account/a' in resp.environ)
        self.assertEqual(resp.environ['swift.account/a']['status'], 200)
예제 #3
0
    def test_container_info_without_req(self):
        base = Controller(self.app)
        base.account_name = 'a'
        base.container_name = 'c'

        container_info = \
            base.container_info(base.account_name,
                                base.container_name)
        self.assertEqual(container_info['status'], 0)
예제 #4
0
파일: test_base.py 프로젝트: vefimova/swift
 def test_transfer_headers_with_sysmeta(self):
     base = Controller(self.app)
     good_hdrs = {'x-base-sysmeta-foo': 'ok',
                  'X-Base-sysmeta-Bar': 'also ok'}
     bad_hdrs = {'x-base-sysmeta-': 'too short'}
     hdrs = dict(good_hdrs)
     hdrs.update(bad_hdrs)
     dst_hdrs = HeaderKeyDict()
     base.transfer_headers(hdrs, dst_hdrs)
     self.assertEqual(HeaderKeyDict(good_hdrs), dst_hdrs)
예제 #5
0
 def test_base_have_quorum(self):
     base = Controller(self.app)
     # just throw a bunch of test cases at it
     self.assertEqual(base.have_quorum([201, 404], 3), False)
     self.assertEqual(base.have_quorum([201, 201], 4), False)
     self.assertEqual(base.have_quorum([201, 201, 404, 404], 4), False)
     self.assertEqual(base.have_quorum([201, 503, 503, 201], 4), False)
     self.assertEqual(base.have_quorum([201, 201], 3), True)
     self.assertEqual(base.have_quorum([404, 404], 3), True)
     self.assertEqual(base.have_quorum([201, 201], 2), True)
     self.assertEqual(base.have_quorum([404, 404], 2), True)
     self.assertEqual(base.have_quorum([201, 404, 201, 201], 4), True)
예제 #6
0
파일: test_base.py 프로젝트: peng1916/swift
 def test_generate_request_headers_with_no_orig_req(self):
     base = Controller(self.app)
     src_headers = {'x-remove-base-meta-owner': 'x',
                    'x-base-meta-size': '151M',
                    'new-owner': 'Kun'}
     dst_headers = base.generate_request_headers(None,
                                                 additional=src_headers)
     expected_headers = {'x-base-meta-size': '151M',
                         'connection': 'close'}
     for k, v in expected_headers.items():
         self.assertDictContainsSubset(expected_headers, dst_headers)
     self.assertEqual('', dst_headers['Referer'])
예제 #7
0
파일: test_base.py 프로젝트: vefimova/swift
 def test_generate_request_headers_with_sysmeta(self):
     base = Controller(self.app)
     good_hdrs = {'x-base-sysmeta-foo': 'ok',
                  'X-Base-sysmeta-Bar': 'also ok'}
     bad_hdrs = {'x-base-sysmeta-': 'too short'}
     hdrs = dict(good_hdrs)
     hdrs.update(bad_hdrs)
     req = Request.blank('/v1/a/c/o', headers=hdrs)
     dst_headers = base.generate_request_headers(req, transfer=True)
     for k, v in good_hdrs.iteritems():
         self.assertTrue(k.lower() in dst_headers)
         self.assertEqual(v, dst_headers[k.lower()])
     for k, v in bad_hdrs.iteritems():
         self.assertFalse(k.lower() in dst_headers)
예제 #8
0
파일: test_base.py 프로젝트: vefimova/swift
 def test_generate_request_headers(self):
     base = Controller(self.app)
     src_headers = {'x-remove-base-meta-owner': 'x',
                    'x-base-meta-size': '151M',
                    'new-owner': 'Kun'}
     req = Request.blank('/v1/a/c/o', headers=src_headers)
     dst_headers = base.generate_request_headers(req, transfer=True)
     expected_headers = {'x-base-meta-owner': '',
                         'x-base-meta-size': '151M',
                         'connection': 'close'}
     for k, v in expected_headers.iteritems():
         self.assertTrue(k in dst_headers)
         self.assertEqual(v, dst_headers[k])
     self.assertFalse('new-owner' in dst_headers)
예제 #9
0
파일: test_base.py 프로젝트: psachin/swift
    def test_options_unauthorized(self):
        base = Controller(self.app)
        base.account_name = 'a'
        base.container_name = 'c'
        self.app.cors_allow_origin = ['http://NOT_IT']
        req = Request.blank('/v1/a/c/o',
                            environ={'swift.cache': FakeCache()},
                            headers={'Origin': 'http://m.com',
                                     'Access-Control-Request-Method': 'GET'})

        with mock.patch('swift.proxy.controllers.base.'
                        'http_connect', fake_http_connect(200)):
            resp = base.OPTIONS(req)
        self.assertEqual(resp.status_int, 401)
예제 #10
0
 def test_base_have_quorum(self):
     base = Controller(self.app)
     # just throw a bunch of test cases at it
     self.assertFalse(base.have_quorum([201, 404], 3))
     self.assertTrue(base.have_quorum([201, 201], 4))
     self.assertFalse(base.have_quorum([201], 4))
     self.assertTrue(base.have_quorum([201, 201, 404, 404], 4))
     self.assertFalse(base.have_quorum([201, 302, 418, 503], 4))
     self.assertTrue(base.have_quorum([201, 503, 503, 201], 4))
     self.assertTrue(base.have_quorum([201, 201], 3))
     self.assertTrue(base.have_quorum([404, 404], 3))
     self.assertTrue(base.have_quorum([201, 201], 2))
     self.assertTrue(base.have_quorum([201, 404], 2))
     self.assertTrue(base.have_quorum([404, 404], 2))
     self.assertTrue(base.have_quorum([201, 404, 201, 201], 4))
예제 #11
0
    def test_GETorHEAD_base(self):
        base = Controller(self.app)
        req = Request.blank('/a/c')
        with patch('swift.proxy.controllers.base.'
                   'http_connect', fake_http_connect(200)):
            resp = base.GETorHEAD_base(req, 'container', FakeRing(), 'part',
                                       '/a/c')
        self.assertTrue('swift.container/a/c' in resp.environ)
        self.assertEqual(resp.environ['swift.container/a/c']['status'], 200)

        req = Request.blank('/a')
        with patch('swift.proxy.controllers.base.'
                   'http_connect', fake_http_connect(200)):
            resp = base.GETorHEAD_base(req, 'account', FakeRing(), 'part',
                                       '/a')
        self.assertTrue('swift.account/a' in resp.environ)
        self.assertEqual(resp.environ['swift.account/a']['status'], 200)
예제 #12
0
파일: test_base.py 프로젝트: psachin/swift
    def test_options_with_null_allow_origin(self):
        base = Controller(self.app)
        base.account_name = 'a'
        base.container_name = 'c'

        def my_container_info(*args):
            return {
                'cors': {
                    'allow_origin': '*',
                }
            }
        base.container_info = my_container_info
        req = Request.blank('/v1/a/c/o',
                            environ={'swift.cache': FakeCache()},
                            headers={'Origin': '*',
                                     'Access-Control-Request-Method': 'GET'})

        with mock.patch('swift.proxy.controllers.base.'
                        'http_connect', fake_http_connect(200)):
            resp = base.OPTIONS(req)
        self.assertEqual(resp.status_int, 200)
예제 #13
0
    def test_GETorHEAD_base(self):
        base = Controller(self.app)
        req = Request.blank('/v1/a/c/o/with/slashes')
        ring = FakeRing()
        nodes = list(ring.get_part_nodes(0)) + list(ring.get_more_nodes(0))
        with patch('swift.proxy.controllers.base.'
                   'http_connect', fake_http_connect(200)):
            resp = base.GETorHEAD_base(req, 'object', iter(nodes), 'part',
                                       '/a/c/o/with/slashes')
        self.assertTrue('swift.object/a/c/o/with/slashes' in resp.environ)
        self.assertEqual(
            resp.environ['swift.object/a/c/o/with/slashes']['status'], 200)
        req = Request.blank('/v1/a/c/o')
        with patch('swift.proxy.controllers.base.'
                   'http_connect', fake_http_connect(200)):
            resp = base.GETorHEAD_base(req, 'object', iter(nodes), 'part',
                                       '/a/c/o')
        self.assertTrue('swift.object/a/c/o' in resp.environ)
        self.assertEqual(resp.environ['swift.object/a/c/o']['status'], 200)
        req = Request.blank('/v1/a/c')
        with patch('swift.proxy.controllers.base.'
                   'http_connect', fake_http_connect(200)):
            resp = base.GETorHEAD_base(req, 'container', iter(nodes), 'part',
                                       '/a/c')
        self.assertTrue('swift.container/a/c' in resp.environ)
        self.assertEqual(resp.environ['swift.container/a/c']['status'], 200)

        req = Request.blank('/v1/a')
        with patch('swift.proxy.controllers.base.'
                   'http_connect', fake_http_connect(200)):
            resp = base.GETorHEAD_base(req, 'account', iter(nodes), 'part',
                                       '/a')
        self.assertTrue('swift.account/a' in resp.environ)
        self.assertEqual(resp.environ['swift.account/a']['status'], 200)

        # Run the above tests again, but this time with concurrent_reads
        # turned on
        policy = next(iter(POLICIES))
        concurrent_get_threads = policy.object_ring.replica_count
        for concurrency_timeout in (0, 2):
            self.app.concurrency_timeout = concurrency_timeout
            req = Request.blank('/v1/a/c/o/with/slashes')
            # NOTE: We are using slow_connect of fake_http_connect as using
            # a concurrency of 0 when mocking the connection is a little too
            # fast for eventlet. Network i/o will make this fine, but mocking
            # it seems is too instantaneous.
            with patch('swift.proxy.controllers.base.http_connect',
                       fake_http_connect(200, slow_connect=True)):
                resp = base.GETorHEAD_base(req,
                                           'object',
                                           iter(nodes),
                                           'part',
                                           '/a/c/o/with/slashes',
                                           concurrency=concurrent_get_threads)
            self.assertTrue('swift.object/a/c/o/with/slashes' in resp.environ)
            self.assertEqual(
                resp.environ['swift.object/a/c/o/with/slashes']['status'], 200)
            req = Request.blank('/v1/a/c/o')
            with patch('swift.proxy.controllers.base.http_connect',
                       fake_http_connect(200, slow_connect=True)):
                resp = base.GETorHEAD_base(req,
                                           'object',
                                           iter(nodes),
                                           'part',
                                           '/a/c/o',
                                           concurrency=concurrent_get_threads)
            self.assertTrue('swift.object/a/c/o' in resp.environ)
            self.assertEqual(resp.environ['swift.object/a/c/o']['status'], 200)
            req = Request.blank('/v1/a/c')
            with patch('swift.proxy.controllers.base.http_connect',
                       fake_http_connect(200, slow_connect=True)):
                resp = base.GETorHEAD_base(req,
                                           'container',
                                           iter(nodes),
                                           'part',
                                           '/a/c',
                                           concurrency=concurrent_get_threads)
            self.assertTrue('swift.container/a/c' in resp.environ)
            self.assertEqual(resp.environ['swift.container/a/c']['status'],
                             200)

            req = Request.blank('/v1/a')
            with patch('swift.proxy.controllers.base.http_connect',
                       fake_http_connect(200, slow_connect=True)):
                resp = base.GETorHEAD_base(req,
                                           'account',
                                           iter(nodes),
                                           'part',
                                           '/a',
                                           concurrency=concurrent_get_threads)
            self.assertTrue('swift.account/a' in resp.environ)
            self.assertEqual(resp.environ['swift.account/a']['status'], 200)