def setUp(self):
        utils.HASH_PATH_SUFFIX = 'endcap'
        utils.HASH_PATH_PREFIX = ''
        self.testdir = mkdtemp()

        accountgz = os.path.join(self.testdir, 'account.ring.gz')
        containergz = os.path.join(self.testdir, 'container.ring.gz')
        objectgz = os.path.join(self.testdir, 'object.ring.gz')
        objectgz_1 = os.path.join(self.testdir, 'object-1.ring.gz')
        self.policy_to_test = 0
        self.expected_path = ('v1', 'a', 'c', 'o1')

        # Let's make the rings slightly different so we can test
        # that the correct ring is consulted (e.g. we don't consult
        # the object ring to get nodes for a container)
        intended_replica2part2dev_id_a = [
            array.array('H', [3, 1, 3, 1]),
            array.array('H', [0, 3, 1, 4]),
            array.array('H', [1, 4, 0, 3])]
        intended_replica2part2dev_id_c = [
            array.array('H', [4, 3, 0, 1]),
            array.array('H', [0, 1, 3, 4]),
            array.array('H', [3, 4, 0, 1])]
        intended_replica2part2dev_id_o = [
            array.array('H', [0, 1, 0, 1]),
            array.array('H', [0, 1, 0, 1]),
            array.array('H', [3, 4, 3, 4])]
        intended_replica2part2dev_id_o_1 = [
            array.array('H', [1, 0, 1, 0]),
            array.array('H', [1, 0, 1, 0]),
            array.array('H', [4, 3, 4, 3])]
        intended_devs = [{'id': 0, 'zone': 0, 'weight': 1.0,
                          'ip': '10.1.1.1', 'port': 6000,
                          'device': 'sda1'},
                         {'id': 1, 'zone': 0, 'weight': 1.0,
                          'ip': '10.1.1.1', 'port': 6000,
                          'device': 'sdb1'},
                         None,
                         {'id': 3, 'zone': 2, 'weight': 1.0,
                          'ip': '10.1.2.1', 'port': 6000,
                          'device': 'sdc1'},
                         {'id': 4, 'zone': 2, 'weight': 1.0,
                          'ip': '10.1.2.2', 'port': 6000,
                          'device': 'sdd1'}]
        intended_part_shift = 30
        ring.RingData(intended_replica2part2dev_id_a,
                      intended_devs, intended_part_shift).save(accountgz)
        ring.RingData(intended_replica2part2dev_id_c,
                      intended_devs, intended_part_shift).save(containergz)
        ring.RingData(intended_replica2part2dev_id_o,
                      intended_devs, intended_part_shift).save(objectgz)
        ring.RingData(intended_replica2part2dev_id_o_1,
                      intended_devs, intended_part_shift).save(objectgz_1)

        self.app = FakeApp()
        self.list_endpoints = list_endpoints.filter_factory(
            {'swift_dir': self.testdir})(self.app)
    def setUp(self):
        utils.HASH_PATH_SUFFIX = 'endcap'
        utils.HASH_PATH_PREFIX = ''
        self.testdir = os.path.join(os.path.dirname(__file__), 'ring')
        rmtree(self.testdir, ignore_errors=1)
        os.mkdir(self.testdir)

        accountgz = os.path.join(self.testdir, 'account.ring.gz')
        containergz = os.path.join(self.testdir, 'container.ring.gz')
        objectgz = os.path.join(self.testdir, 'object.ring.gz')

        # Let's make the rings slightly different so we can test
        # that the correct ring is consulted (e.g. we don't consult
        # the object ring to get nodes for a container)
        intended_replica2part2dev_id_a = [
            array.array('H', [3, 1, 3, 1]),
            array.array('H', [0, 3, 1, 4]),
            array.array('H', [1, 4, 0, 3])]
        intended_replica2part2dev_id_c = [
            array.array('H', [4, 3, 0, 1]),
            array.array('H', [0, 1, 3, 4]),
            array.array('H', [3, 4, 0, 1])]
        intended_replica2part2dev_id_o = [
            array.array('H', [0, 1, 0, 1]),
            array.array('H', [0, 1, 0, 1]),
            array.array('H', [3, 4, 3, 4])]
        intended_devs = [{'id': 0, 'zone': 0, 'weight': 1.0,
                          'ip': '10.1.1.1', 'port': 6000,
                          'device': 'sda1'},
                         {'id': 1, 'zone': 0, 'weight': 1.0,
                          'ip': '10.1.1.1', 'port': 6000,
                          'device': 'sdb1'},
                         None,
                         {'id': 3, 'zone': 2, 'weight': 1.0,
                          'ip': '10.1.2.1', 'port': 6000,
                          'device': 'sdc1'},
                         {'id': 4, 'zone': 2, 'weight': 1.0,
                          'ip': '10.1.2.2', 'port': 6000,
                          'device': 'sdd1'}]
        intended_part_shift = 30
        intended_reload_time = 15
        ring.RingData(intended_replica2part2dev_id_a,
                      intended_devs, intended_part_shift).save(accountgz)
        ring.RingData(intended_replica2part2dev_id_c,
                      intended_devs, intended_part_shift).save(containergz)
        ring.RingData(intended_replica2part2dev_id_o,
                      intended_devs, intended_part_shift).save(objectgz)

        self.app = FakeApp()
        self.list_endpoints = list_endpoints.filter_factory(
            {'swift_dir': self.testdir})(self.app)
    def setUp(self):
        ondisk.HASH_PATH_SUFFIX = 'endcap'
        ondisk.HASH_PATH_PREFIX = ''
        self.testdir = os.path.join(os.path.dirname(__file__), 'ring')
        rmtree(self.testdir, ignore_errors=1)
        os.mkdir(self.testdir)

        accountgz = os.path.join(self.testdir, 'account.ring.gz')
        containergz = os.path.join(self.testdir, 'container.ring.gz')
        objectgz = os.path.join(self.testdir, 'object.ring.gz')

        # Let's make the rings slightly different so we can test
        # that the correct ring is consulted (e.g. we don't consult
        # the object ring to get nodes for a container)
        intended_replica2part2dev_id_a = [
            array.array('H', [3, 1, 3, 1]),
            array.array('H', [0, 3, 1, 4]),
            array.array('H', [1, 4, 0, 3])]
        intended_replica2part2dev_id_c = [
            array.array('H', [4, 3, 0, 1]),
            array.array('H', [0, 1, 3, 4]),
            array.array('H', [3, 4, 0, 1])]
        intended_replica2part2dev_id_o = [
            array.array('H', [0, 1, 0, 1]),
            array.array('H', [0, 1, 0, 1]),
            array.array('H', [3, 4, 3, 4])]
        intended_devs = [{'id': 0, 'zone': 0, 'weight': 1.0,
                          'ip': '10.1.1.1', 'port': 6000,
                          'device': 'sda1'},
                         {'id': 1, 'zone': 0, 'weight': 1.0,
                          'ip': '10.1.1.1', 'port': 6000,
                          'device': 'sdb1'},
                         None,
                         {'id': 3, 'zone': 2, 'weight': 1.0,
                          'ip': '10.1.2.1', 'port': 6000,
                          'device': 'sdc1'},
                         {'id': 4, 'zone': 2, 'weight': 1.0,
                          'ip': '10.1.2.2', 'port': 6000,
                          'device': 'sdd1'}]
        intended_part_shift = 30
        ring.RingData(intended_replica2part2dev_id_a,
                      intended_devs, intended_part_shift).save(accountgz)
        ring.RingData(intended_replica2part2dev_id_c,
                      intended_devs, intended_part_shift).save(containergz)
        ring.RingData(intended_replica2part2dev_id_o,
                      intended_devs, intended_part_shift).save(objectgz)

        self.app = FakeApp()
        self.list_endpoints = list_endpoints.filter_factory(
            {'swift_dir': self.testdir})(self.app)
Example #4
0
    def setUp(self):
        utils.HASH_PATH_SUFFIX = "endcap"
        utils.HASH_PATH_PREFIX = ""
        self.testdir = os.path.join(os.path.dirname(__file__), "ring")
        rmtree(self.testdir, ignore_errors=1)
        os.mkdir(self.testdir)

        accountgz = os.path.join(self.testdir, "account.ring.gz")
        containergz = os.path.join(self.testdir, "container.ring.gz")
        objectgz = os.path.join(self.testdir, "object.ring.gz")

        # Let's make the rings slightly different so we can test
        # that the correct ring is consulted (e.g. we don't consult
        # the object ring to get nodes for a container)
        intended_replica2part2dev_id_a = [
            array.array("H", [3, 1, 3, 1]),
            array.array("H", [0, 3, 1, 4]),
            array.array("H", [1, 4, 0, 3]),
        ]
        intended_replica2part2dev_id_c = [
            array.array("H", [4, 3, 0, 1]),
            array.array("H", [0, 1, 3, 4]),
            array.array("H", [3, 4, 0, 1]),
        ]
        intended_replica2part2dev_id_o = [
            array.array("H", [0, 1, 0, 1]),
            array.array("H", [0, 1, 0, 1]),
            array.array("H", [3, 4, 3, 4]),
        ]
        intended_devs = [
            {"id": 0, "zone": 0, "weight": 1.0, "ip": "10.1.1.1", "port": 6000, "device": "sda1"},
            {"id": 1, "zone": 0, "weight": 1.0, "ip": "10.1.1.1", "port": 6000, "device": "sdb1"},
            None,
            {"id": 3, "zone": 2, "weight": 1.0, "ip": "10.1.2.1", "port": 6000, "device": "sdc1"},
            {"id": 4, "zone": 2, "weight": 1.0, "ip": "10.1.2.2", "port": 6000, "device": "sdd1"},
        ]
        intended_part_shift = 30
        intended_reload_time = 15
        ring.RingData(intended_replica2part2dev_id_a, intended_devs, intended_part_shift).save(accountgz)
        ring.RingData(intended_replica2part2dev_id_c, intended_devs, intended_part_shift).save(containergz)
        ring.RingData(intended_replica2part2dev_id_o, intended_devs, intended_part_shift).save(objectgz)

        self.app = FakeApp()
        self.list_endpoints = list_endpoints.filter_factory({"swift_dir": self.testdir})(self.app)
    def test_get_endpoint(self):
        # Expected results for objects taken from test_ring
        # Expected results for others computed by manually invoking
        # ring.get_nodes().
        resp = Request.blank("/endpoints/a/c/o1").get_response(self.list_endpoints)
        self.assertEquals(resp.status_int, 200)
        self.assertEquals(resp.content_type, "application/json")
        self.assertEquals(
            json.loads(resp.body), ["http://10.1.1.1:6000/sdb1/1/a/c/o1", "http://10.1.2.2:6000/sdd1/1/a/c/o1"]
        )

        # Here, 'o1/' is the object name.
        resp = Request.blank("/endpoints/a/c/o1/").get_response(self.list_endpoints)
        self.assertEquals(resp.status_int, 200)
        self.assertEquals(
            json.loads(resp.body), ["http://10.1.1.1:6000/sdb1/3/a/c/o1/", "http://10.1.2.2:6000/sdd1/3/a/c/o1/"]
        )

        resp = Request.blank("/endpoints/a/c2").get_response(self.list_endpoints)
        self.assertEquals(resp.status_int, 200)
        self.assertEquals(
            json.loads(resp.body), ["http://10.1.1.1:6000/sda1/2/a/c2", "http://10.1.2.1:6000/sdc1/2/a/c2"]
        )

        resp = Request.blank("/endpoints/a1").get_response(self.list_endpoints)
        self.assertEquals(resp.status_int, 200)
        self.assertEquals(
            json.loads(resp.body),
            ["http://10.1.2.1:6000/sdc1/0/a1", "http://10.1.1.1:6000/sda1/0/a1", "http://10.1.1.1:6000/sdb1/0/a1"],
        )

        resp = Request.blank("/endpoints/").get_response(self.list_endpoints)
        self.assertEquals(resp.status_int, 400)

        resp = Request.blank("/endpoints/a/c 2").get_response(self.list_endpoints)
        self.assertEquals(resp.status_int, 200)
        self.assertEquals(
            json.loads(resp.body), ["http://10.1.1.1:6000/sdb1/3/a/c%202", "http://10.1.2.2:6000/sdd1/3/a/c%202"]
        )

        resp = Request.blank("/endpoints/a/c%202").get_response(self.list_endpoints)
        self.assertEquals(resp.status_int, 200)
        self.assertEquals(
            json.loads(resp.body), ["http://10.1.1.1:6000/sdb1/3/a/c%202", "http://10.1.2.2:6000/sdd1/3/a/c%202"]
        )

        resp = Request.blank("/endpoints/ac%20count/con%20tainer/ob%20ject").get_response(self.list_endpoints)
        self.assertEquals(resp.status_int, 200)
        self.assertEquals(
            json.loads(resp.body),
            [
                "http://10.1.1.1:6000/sdb1/3/ac%20count/con%20tainer/ob%20ject",
                "http://10.1.2.2:6000/sdd1/3/ac%20count/con%20tainer/ob%20ject",
            ],
        )

        resp = Request.blank("/endpoints/a/c/o1", {"REQUEST_METHOD": "POST"}).get_response(self.list_endpoints)
        self.assertEquals(resp.status_int, 405)
        self.assertEquals(resp.status, "405 Method Not Allowed")
        self.assertEquals(resp.headers["allow"], "GET")

        resp = Request.blank("/not-endpoints").get_response(self.list_endpoints)
        self.assertEquals(resp.status_int, 200)
        self.assertEquals(resp.status, "200 OK")
        self.assertEquals(resp.body, "FakeApp")

        # test custom path with trailing slash
        custom_path_le = list_endpoints.filter_factory(
            {"swift_dir": self.testdir, "list_endpoints_path": "/some/another/path/"}
        )(self.app)
        resp = Request.blank("/some/another/path/a/c/o1").get_response(custom_path_le)
        self.assertEquals(resp.status_int, 200)
        self.assertEquals(resp.content_type, "application/json")
        self.assertEquals(
            json.loads(resp.body), ["http://10.1.1.1:6000/sdb1/1/a/c/o1", "http://10.1.2.2:6000/sdd1/1/a/c/o1"]
        )

        # test ustom path without trailing slash
        custom_path_le = list_endpoints.filter_factory(
            {"swift_dir": self.testdir, "list_endpoints_path": "/some/another/path"}
        )(self.app)
        resp = Request.blank("/some/another/path/a/c/o1").get_response(custom_path_le)
        self.assertEquals(resp.status_int, 200)
        self.assertEquals(resp.content_type, "application/json")
        self.assertEquals(
            json.loads(resp.body), ["http://10.1.1.1:6000/sdb1/1/a/c/o1", "http://10.1.2.2:6000/sdd1/1/a/c/o1"]
        )
    def test_get_endpoint(self):
        # Expected results for objects taken from test_ring
        # Expected results for others computed by manually invoking
        # ring.get_nodes().
        resp = Request.blank('/endpoints/a/c/o1').get_response(
            self.list_endpoints)
        self.assertEquals(resp.status_int, 200)
        self.assertEquals(resp.content_type, 'application/json')
        self.assertEquals(json.loads(resp.body), [
            "http://10.1.1.1:6000/sdb1/1/a/c/o1",
            "http://10.1.2.2:6000/sdd1/1/a/c/o1"
        ])

        # test policies with no version endpoint name
        expected = [[
                    "http://10.1.1.1:6000/sdb1/1/a/c/o1",
                    "http://10.1.2.2:6000/sdd1/1/a/c/o1"], [
                    "http://10.1.1.1:6000/sda1/1/a/c/o1",
                    "http://10.1.2.1:6000/sdc1/1/a/c/o1"
                    ]]
        PATCHGI = 'swift.common.middleware.list_endpoints.get_container_info'
        for pol in POLICIES:
            self.policy_to_test = pol.idx
            with mock.patch(PATCHGI, self.FakeGetInfo):
                resp = Request.blank('/endpoints/a/c/o1').get_response(
                    self.list_endpoints)
            self.assertEquals(resp.status_int, 200)
            self.assertEquals(resp.content_type, 'application/json')
            self.assertEquals(json.loads(resp.body), expected[pol.idx])

        # Here, 'o1/' is the object name.
        resp = Request.blank('/endpoints/a/c/o1/').get_response(
            self.list_endpoints)
        self.assertEquals(resp.status_int, 200)
        self.assertEquals(json.loads(resp.body), [
            "http://10.1.1.1:6000/sdb1/3/a/c/o1/",
            "http://10.1.2.2:6000/sdd1/3/a/c/o1/"
        ])

        resp = Request.blank('/endpoints/a/c2').get_response(
            self.list_endpoints)
        self.assertEquals(resp.status_int, 200)
        self.assertEquals(json.loads(resp.body), [
            "http://10.1.1.1:6000/sda1/2/a/c2",
            "http://10.1.2.1:6000/sdc1/2/a/c2"
        ])

        resp = Request.blank('/endpoints/a1').get_response(
            self.list_endpoints)
        self.assertEquals(resp.status_int, 200)
        self.assertEquals(json.loads(resp.body), [
            "http://10.1.2.1:6000/sdc1/0/a1",
            "http://10.1.1.1:6000/sda1/0/a1",
            "http://10.1.1.1:6000/sdb1/0/a1"
        ])

        resp = Request.blank('/endpoints/').get_response(
            self.list_endpoints)
        self.assertEquals(resp.status_int, 400)

        resp = Request.blank('/endpoints/a/c 2').get_response(
            self.list_endpoints)
        self.assertEquals(resp.status_int, 200)
        self.assertEquals(json.loads(resp.body), [
            "http://10.1.1.1:6000/sdb1/3/a/c%202",
            "http://10.1.2.2:6000/sdd1/3/a/c%202"
        ])

        resp = Request.blank('/endpoints/a/c%202').get_response(
            self.list_endpoints)
        self.assertEquals(resp.status_int, 200)
        self.assertEquals(json.loads(resp.body), [
            "http://10.1.1.1:6000/sdb1/3/a/c%202",
            "http://10.1.2.2:6000/sdd1/3/a/c%202"
        ])

        resp = Request.blank('/endpoints/ac%20count/con%20tainer/ob%20ject') \
            .get_response(self.list_endpoints)
        self.assertEquals(resp.status_int, 200)
        self.assertEquals(json.loads(resp.body), [
            "http://10.1.1.1:6000/sdb1/3/ac%20count/con%20tainer/ob%20ject",
            "http://10.1.2.2:6000/sdd1/3/ac%20count/con%20tainer/ob%20ject"
        ])

        resp = Request.blank('/endpoints/a/c/o1', {'REQUEST_METHOD': 'POST'}) \
            .get_response(self.list_endpoints)
        self.assertEquals(resp.status_int, 405)
        self.assertEquals(resp.status, '405 Method Not Allowed')
        self.assertEquals(resp.headers['allow'], 'GET')

        resp = Request.blank('/not-endpoints').get_response(
            self.list_endpoints)
        self.assertEquals(resp.status_int, 200)
        self.assertEquals(resp.status, '200 OK')
        self.assertEquals(resp.body, 'FakeApp')

        # test policies with custom endpoint name
        for pol in POLICIES:
            # test custom path with trailing slash
            custom_path_le = list_endpoints.filter_factory({
                'swift_dir': self.testdir,
                'list_endpoints_path': '/some/another/path/'
            })(self.app)
            self.policy_to_test = pol.idx
            with mock.patch(PATCHGI, self.FakeGetInfo):
                resp = Request.blank('/some/another/path/a/c/o1') \
                    .get_response(custom_path_le)
            self.assertEquals(resp.status_int, 200)
            self.assertEquals(resp.content_type, 'application/json')
            self.assertEquals(json.loads(resp.body), expected[pol.idx])

            # test custom path without trailing slash
            custom_path_le = list_endpoints.filter_factory({
                'swift_dir': self.testdir,
                'list_endpoints_path': '/some/another/path'
            })(self.app)
            self.policy_to_test = pol.idx
            with mock.patch(PATCHGI, self.FakeGetInfo):
                resp = Request.blank('/some/another/path/a/c/o1') \
                    .get_response(custom_path_le)
            self.assertEquals(resp.status_int, 200)
            self.assertEquals(resp.content_type, 'application/json')
            self.assertEquals(json.loads(resp.body), expected[pol.idx])
Example #7
0
    def test_get_endpoint(self):
        # Expected results for objects taken from test_ring
        # Expected results for others computed by manually invoking
        # ring.get_nodes().
        resp = Request.blank('/endpoints/a/c/o1').get_response(
            self.list_endpoints)
        self.assertEquals(resp.status_int, 200)
        self.assertEquals(resp.content_type, 'application/json')
        self.assertEquals(json.loads(resp.body), [
            "http://10.1.1.1:6000/sdb1/1/a/c/o1",
            "http://10.1.2.2:6000/sdd1/1/a/c/o1"
        ])

        # Here, 'o1/' is the object name.
        resp = Request.blank('/endpoints/a/c/o1/').get_response(
            self.list_endpoints)
        self.assertEquals(resp.status_int, 200)
        self.assertEquals(json.loads(resp.body), [
            "http://10.1.1.1:6000/sdb1/3/a/c/o1/",
            "http://10.1.2.2:6000/sdd1/3/a/c/o1/"
        ])

        resp = Request.blank('/endpoints/a/c2').get_response(
            self.list_endpoints)
        self.assertEquals(resp.status_int, 200)
        self.assertEquals(json.loads(resp.body), [
            "http://10.1.1.1:6000/sda1/2/a/c2",
            "http://10.1.2.1:6000/sdc1/2/a/c2"
        ])

        resp = Request.blank('/endpoints/a1').get_response(
            self.list_endpoints)
        self.assertEquals(resp.status_int, 200)
        self.assertEquals(json.loads(resp.body), [
            "http://10.1.2.1:6000/sdc1/0/a1",
            "http://10.1.1.1:6000/sda1/0/a1",
            "http://10.1.1.1:6000/sdb1/0/a1"
        ])

        resp = Request.blank('/endpoints/').get_response(
            self.list_endpoints)
        self.assertEquals(resp.status_int, 400)

        resp = Request.blank('/endpoints/a/c 2').get_response(
            self.list_endpoints)
        self.assertEquals(resp.status_int, 200)
        self.assertEquals(json.loads(resp.body), [
            "http://10.1.1.1:6000/sdb1/3/a/c%202",
            "http://10.1.2.2:6000/sdd1/3/a/c%202"
        ])

        resp = Request.blank('/endpoints/a/c%202').get_response(
            self.list_endpoints)
        self.assertEquals(resp.status_int, 200)
        self.assertEquals(json.loads(resp.body), [
            "http://10.1.1.1:6000/sdb1/3/a/c%202",
            "http://10.1.2.2:6000/sdd1/3/a/c%202"
        ])

        resp = Request.blank('/endpoints/ac%20count/con%20tainer/ob%20ject') \
            .get_response(self.list_endpoints)
        self.assertEquals(resp.status_int, 200)
        self.assertEquals(json.loads(resp.body), [
            "http://10.1.1.1:6000/sdb1/3/ac%20count/con%20tainer/ob%20ject",
            "http://10.1.2.2:6000/sdd1/3/ac%20count/con%20tainer/ob%20ject"
        ])

        resp = Request.blank('/endpoints/a/c/o1', {'REQUEST_METHOD': 'POST'}) \
            .get_response(self.list_endpoints)
        self.assertEquals(resp.status_int, 405)
        self.assertEquals(resp.status, '405 Method Not Allowed')
        self.assertEquals(resp.headers['allow'], 'GET')

        resp = Request.blank('/not-endpoints').get_response(
            self.list_endpoints)
        self.assertEquals(resp.status_int, 200)
        self.assertEquals(resp.status, '200 OK')
        self.assertEquals(resp.body, 'FakeApp')

        # test custom path with trailing slash
        custom_path_le = list_endpoints.filter_factory({
            'swift_dir': self.testdir,
            'list_endpoints_path': '/some/another/path/'
        })(self.app)
        resp = Request.blank('/some/another/path/a/c/o1') \
            .get_response(custom_path_le)
        self.assertEquals(resp.status_int, 200)
        self.assertEquals(resp.content_type, 'application/json')
        self.assertEquals(json.loads(resp.body), [
            "http://10.1.1.1:6000/sdb1/1/a/c/o1",
            "http://10.1.2.2:6000/sdd1/1/a/c/o1"
        ])

        # test ustom path without trailing slash
        custom_path_le = list_endpoints.filter_factory({
            'swift_dir': self.testdir,
            'list_endpoints_path': '/some/another/path'
        })(self.app)
        resp = Request.blank('/some/another/path/a/c/o1') \
            .get_response(custom_path_le)
        self.assertEquals(resp.status_int, 200)
        self.assertEquals(resp.content_type, 'application/json')
        self.assertEquals(json.loads(resp.body), [
            "http://10.1.1.1:6000/sdb1/1/a/c/o1",
            "http://10.1.2.2:6000/sdd1/1/a/c/o1"
        ])
Example #8
0
    def setUp(self):
        utils.HASH_PATH_SUFFIX = 'endcap'
        utils.HASH_PATH_PREFIX = ''
        self.testdir = mkdtemp()

        accountgz = os.path.join(self.testdir, 'account.ring.gz')
        containergz = os.path.join(self.testdir, 'container.ring.gz')
        objectgz = os.path.join(self.testdir, 'object.ring.gz')
        objectgz_1 = os.path.join(self.testdir, 'object-1.ring.gz')
        self.policy_to_test = 0
        self.expected_path = ('v1', 'a', 'c', 'o1')

        # Let's make the rings slightly different so we can test
        # that the correct ring is consulted (e.g. we don't consult
        # the object ring to get nodes for a container)
        intended_replica2part2dev_id_a = [
            array.array('H', [3, 1, 3, 1]),
            array.array('H', [0, 3, 1, 4]),
            array.array('H', [1, 4, 0, 3])
        ]
        intended_replica2part2dev_id_c = [
            array.array('H', [4, 3, 0, 1]),
            array.array('H', [0, 1, 3, 4]),
            array.array('H', [3, 4, 0, 1])
        ]
        intended_replica2part2dev_id_o = [
            array.array('H', [0, 1, 0, 1]),
            array.array('H', [0, 1, 0, 1]),
            array.array('H', [3, 4, 3, 4])
        ]
        intended_replica2part2dev_id_o_1 = [
            array.array('H', [1, 0, 1, 0]),
            array.array('H', [1, 0, 1, 0]),
            array.array('H', [4, 3, 4, 3])
        ]
        intended_devs = [{
            'id': 0,
            'zone': 0,
            'weight': 1.0,
            'ip': '10.1.1.1',
            'port': 6200,
            'device': 'sda1'
        }, {
            'id': 1,
            'zone': 0,
            'weight': 1.0,
            'ip': '10.1.1.1',
            'port': 6200,
            'device': 'sdb1'
        }, None, {
            'id': 3,
            'zone': 2,
            'weight': 1.0,
            'ip': '10.1.2.1',
            'port': 6200,
            'device': 'sdc1'
        }, {
            'id': 4,
            'zone': 2,
            'weight': 1.0,
            'ip': '10.1.2.2',
            'port': 6200,
            'device': 'sdd1'
        }]
        intended_part_shift = 30
        ring.RingData(intended_replica2part2dev_id_a, intended_devs,
                      intended_part_shift).save(accountgz)
        ring.RingData(intended_replica2part2dev_id_c, intended_devs,
                      intended_part_shift).save(containergz)
        ring.RingData(intended_replica2part2dev_id_o, intended_devs,
                      intended_part_shift).save(objectgz)
        ring.RingData(intended_replica2part2dev_id_o_1, intended_devs,
                      intended_part_shift).save(objectgz_1)

        self.app = FakeApp()
        self.list_endpoints = list_endpoints.filter_factory(
            {'swift_dir': self.testdir})(self.app)
Example #9
0
    def test_get_endpoint(self):
        # Expected results for objects taken from test_ring
        # Expected results for others computed by manually invoking
        # ring.get_nodes().
        resp = Request.blank('/endpoints/a/c/o1').get_response(
            self.list_endpoints)
        self.assertEqual(resp.status_int, 200)
        self.assertEqual(resp.content_type, 'application/json')
        self.assertEqual(json.loads(resp.body), [
            "http://10.1.1.1:6200/sdb1/1/a/c/o1",
            "http://10.1.2.2:6200/sdd1/1/a/c/o1"
        ])

        # test policies with no version endpoint name
        expected = [[
            "http://10.1.1.1:6200/sdb1/1/a/c/o1",
            "http://10.1.2.2:6200/sdd1/1/a/c/o1"
        ],
                    [
                        "http://10.1.1.1:6200/sda1/1/a/c/o1",
                        "http://10.1.2.1:6200/sdc1/1/a/c/o1"
                    ]]
        PATCHGI = 'swift.common.middleware.list_endpoints.get_container_info'
        for pol in POLICIES:
            self.policy_to_test = pol.idx
            with mock.patch(PATCHGI, self.FakeGetInfo):
                resp = Request.blank('/endpoints/a/c/o1').get_response(
                    self.list_endpoints)
            self.assertEqual(resp.status_int, 200)
            self.assertEqual(resp.content_type, 'application/json')
            self.assertEqual(json.loads(resp.body), expected[pol.idx])

        # Here, 'o1/' is the object name.
        resp = Request.blank('/endpoints/a/c/o1/').get_response(
            self.list_endpoints)
        self.assertEqual(resp.status_int, 200)
        self.assertEqual(json.loads(resp.body), [
            "http://10.1.1.1:6200/sdb1/3/a/c/o1/",
            "http://10.1.2.2:6200/sdd1/3/a/c/o1/"
        ])

        resp = Request.blank('/endpoints/a/c2').get_response(
            self.list_endpoints)
        self.assertEqual(resp.status_int, 200)
        self.assertEqual(json.loads(resp.body), [
            "http://10.1.1.1:6200/sda1/2/a/c2",
            "http://10.1.2.1:6200/sdc1/2/a/c2"
        ])

        resp = Request.blank('/endpoints/a1').get_response(self.list_endpoints)
        self.assertEqual(resp.status_int, 200)
        self.assertEqual(json.loads(resp.body), [
            "http://10.1.2.1:6200/sdc1/0/a1", "http://10.1.1.1:6200/sda1/0/a1",
            "http://10.1.1.1:6200/sdb1/0/a1"
        ])

        resp = Request.blank('/endpoints/').get_response(self.list_endpoints)
        self.assertEqual(resp.status_int, 400)

        resp = Request.blank('/endpoints/a/c 2').get_response(
            self.list_endpoints)
        self.assertEqual(resp.status_int, 200)
        self.assertEqual(json.loads(resp.body), [
            "http://10.1.1.1:6200/sdb1/3/a/c%202",
            "http://10.1.2.2:6200/sdd1/3/a/c%202"
        ])

        resp = Request.blank('/endpoints/a/c%202').get_response(
            self.list_endpoints)
        self.assertEqual(resp.status_int, 200)
        self.assertEqual(json.loads(resp.body), [
            "http://10.1.1.1:6200/sdb1/3/a/c%202",
            "http://10.1.2.2:6200/sdd1/3/a/c%202"
        ])

        resp = Request.blank('/endpoints/ac%20count/con%20tainer/ob%20ject') \
            .get_response(self.list_endpoints)
        self.assertEqual(resp.status_int, 200)
        self.assertEqual(json.loads(resp.body), [
            "http://10.1.1.1:6200/sdb1/3/ac%20count/con%20tainer/ob%20ject",
            "http://10.1.2.2:6200/sdd1/3/ac%20count/con%20tainer/ob%20ject"
        ])

        resp = Request.blank('/endpoints/a/c/o1', {'REQUEST_METHOD': 'POST'}) \
            .get_response(self.list_endpoints)
        self.assertEqual(resp.status_int, 405)
        self.assertEqual(resp.status, '405 Method Not Allowed')
        self.assertEqual(resp.headers['allow'], 'GET')

        resp = Request.blank('/not-endpoints').get_response(
            self.list_endpoints)
        self.assertEqual(resp.status_int, 200)
        self.assertEqual(resp.status, '200 OK')
        self.assertEqual(resp.body, 'FakeApp')

        # test policies with custom endpoint name
        for pol in POLICIES:
            # test custom path with trailing slash
            custom_path_le = list_endpoints.filter_factory({
                'swift_dir':
                self.testdir,
                'list_endpoints_path':
                '/some/another/path/'
            })(self.app)
            self.policy_to_test = pol.idx
            with mock.patch(PATCHGI, self.FakeGetInfo):
                resp = Request.blank('/some/another/path/a/c/o1') \
                    .get_response(custom_path_le)
            self.assertEqual(resp.status_int, 200)
            self.assertEqual(resp.content_type, 'application/json')
            self.assertEqual(json.loads(resp.body), expected[pol.idx])

            # test custom path without trailing slash
            custom_path_le = list_endpoints.filter_factory({
                'swift_dir':
                self.testdir,
                'list_endpoints_path':
                '/some/another/path'
            })(self.app)
            self.policy_to_test = pol.idx
            with mock.patch(PATCHGI, self.FakeGetInfo):
                resp = Request.blank('/some/another/path/a/c/o1') \
                    .get_response(custom_path_le)
            self.assertEqual(resp.status_int, 200)
            self.assertEqual(resp.content_type, 'application/json')
            self.assertEqual(json.loads(resp.body), expected[pol.idx])