HDFGroup / hsds

Cloud-native, service based access to HDF data
https://www.hdfgroup.org/solutions/hdf-kita/
Apache License 2.0
126 stars 52 forks source link

Can't write to H5T_ARRAY datasets #249

Open mattjala opened 10 months ago

mattjala commented 10 months ago

Test code attempting to create and write to an H5T_ARRAY dataset (originally written in value_test.py):

    def testPutArray(self):
        headers = helper.getRequestHeaders(domain=self.base_domain)
        req = self.endpoint + "/"

        # Get root uuid
        rsp = self.session.get(req, headers=headers)
        self.assertEqual(rsp.status_code, 200)
        rspJson = json.loads(rsp.text)
        root_uuid = rspJson["root"]
        helper.validateId(root_uuid)

        datatype = {
            "class": "H5T_ARRAY",
            "base": {
                "class": "H5T_INTEGER",
                "base": "H5T_STD_I32LE"
            },
            "dims": [6]
        }

        payload = { 
            "type": datatype,
            "shape": 1,
        }

        req = self.endpoint + "/datasets"
        rsp = self.session.post(req, data=json.dumps(payload), headers=headers)
        self.assertEqual(rsp.status_code, 201)  # create dataset

        rspJson = json.loads(rsp.text)
        array_dset_uuid = rspJson["id"]
        self.assertTrue(helper.validateId(array_dset_uuid))

        # verify the shape of the dataset
        req = self.endpoint + "/datasets/" + array_dset_uuid
        rsp = self.session.get(req, headers=headers)
        self.assertEqual(rsp.status_code, 200)  # get dataset
        rspJson = json.loads(rsp.text)
        shape = rspJson["shape"]
        self.assertEqual(shape["class"], "H5S_SIMPLE")

        # link new dataset as 'array_type_dset'
        name = "array_type_dset"
        req = self.endpoint + "/groups/" + root_uuid + "/links/" + name
        payload = {"id": array_dset_uuid}
        rsp = self.session.put(req, data=json.dumps(payload), headers=headers)
        self.assertEqual(rsp.status_code, 201)

        # read initial values
        req = self.endpoint + "/datasets/" + array_dset_uuid + "/value"
        rsp = self.session.get(req, headers=headers)
        self.assertEqual(rsp.status_code, 200)
        rspJson = json.loads(rsp.text)
        self.assertTrue("value" in rspJson)
        self.assertTrue(np.array_equal(rspJson["value"][0], np.zeros(6)))

        # write to the array
        value = [[1, 2, 3, 4, 5, 6]]
        payload = {"value": value}
        req = self.endpoint + "/datasets/" + array_dset_uuid + "/value"
        rsp = self.session.put(req, data=json.dumps(payload), headers=headers)
        self.assertEqual(rsp.status_code, 200)  # write value

        # read back the value
        rsp = self.session.get(req, headers=headers)
        self.assertEqual(rsp.status_code, 200)
        rspJson = json.loads(rsp.text)
        self.assertTrue("value" in rspJson)
        self.assertTrue(np.array_equal(rspJson["value"], value))

This fails at the 200 response code assert after trying to write to the dataset with AssertionError: 400 != 200.

Log output from the service node:

REQ> PUT: /datasets/d-5b64a0fe-22b9a690-5c8a-aeba16-834c57/value [/home/test_user1/hsds_test/valuetest/20230822T165739_378063Z]
DEBUG> num tasks: 4 active tasks: 4
DEBUG> validateUserPassword username: test_user1
DEBUG> looking up username: test_user1
DEBUG> user password validated
DEBUG> PUT value - request_type is json
INFO> getObjectJson d-5b64a0fe-22b9a690-5c8a-aeba16-834c57
DEBUG> found d-5b64a0fe-22b9a690-5c8a-aeba16-834c57 in meta_cache
DEBUG> PUT Value selection: (slice(0, 1, 1),)
DEBUG> selection shape: [1]
DEBUG> selection num elements: 1
WARN> input data doesn't match selection