def test_grpc_to_rest(self): # Make sure that object created by `gRPC` works with `REST`'s request. spec = storage_pb2.InsertObjectSpec(resource={ "name": "object", "bucket": "bucket" }) request = storage_pb2.StartResumableWriteRequest( insert_object_spec=spec) upload = gcs.holder.DataHolder.init_resumable_grpc( request, self.bucket.metadata, "") blob, _ = gcs.object.Object.init(upload.request, upload.metadata, b"123456789", upload.bucket, False, "") self.assertDictEqual(blob.rest_only, {}) self.assertEqual(blob.metadata.bucket, "bucket") self.assertEqual(blob.metadata.name, "object") self.assertEqual(blob.media, b"123456789") # `REST` GET rest_metadata = blob.rest_metadata() self.assertEqual(rest_metadata["bucket"], "bucket") self.assertEqual(rest_metadata["name"], "object") self.assertIsNone(blob.metadata.metadata.get("method")) # `REST` PATCH request = utils.common.FakeRequest( args={}, data=json.dumps({"metadata": { "method": "rest" }})) blob.patch(request, None) self.assertEqual(blob.metadata.metadata["method"], "rest")
def test_init_resumable_grpc(self): request = storage_pb2.InsertBucketRequest(bucket={"name": "bucket"}) bucket, _ = gcs.bucket.Bucket.init(request, "") bucket = bucket.metadata insert_object_spec = storage_pb2.InsertObjectSpec( resource={ "name": "object", "bucket": "bucket" }, predefined_acl=CommonEnums.PredefinedObjectAcl. OBJECT_ACL_PROJECT_PRIVATE, if_generation_not_match={"value": 1}, if_metageneration_match={"value": 2}, if_metageneration_not_match={"value": 3}, projection=CommonEnums.Projection.FULL, ) request = storage_pb2.InsertObjectRequest( insert_object_spec=insert_object_spec, write_offset=0) upload = gcs.holder.DataHolder.init_resumable_grpc(request, bucket, "") # Verify the annotations inserted by the emulator. annotations = upload.metadata.metadata self.assertGreaterEqual( set([ "x_emulator_upload", "x_emulator_no_crc32c", "x_emulator_no_md5" ]), set(annotations.keys()), ) # Clear any annotations created by the emulator upload.metadata.metadata.clear() self.assertEqual(upload.metadata, resources_pb2.Object(name="object", bucket="bucket")) predefined_acl = utils.acl.extract_predefined_acl( upload.request, False, "") self.assertEqual( predefined_acl, CommonEnums.PredefinedObjectAcl.OBJECT_ACL_PROJECT_PRIVATE) match, not_match = utils.generation.extract_precondition( upload.request, False, False, "") self.assertIsNone(match) self.assertEqual(not_match, 1) match, not_match = utils.generation.extract_precondition( upload.request, True, False, "") self.assertEqual(match, 2) self.assertEqual(not_match, 3) projection = utils.common.extract_projection(upload.request, False, "") self.assertEqual(projection, CommonEnums.Projection.FULL)
def test_init_resumable_grpc(self): request = storage_pb2.InsertBucketRequest(bucket={"name": "bucket"}) bucket, _ = gcs.bucket.Bucket.init(request, "") bucket = bucket.metadata insert_object_spec = storage_pb2.InsertObjectSpec( resource={ "name": "object", "bucket": "bucket" }, predefined_acl=CommonEnums.PredefinedObjectAcl. OBJECT_ACL_PROJECT_PRIVATE, if_generation_not_match={"value": 1}, if_metageneration_match={"value": 2}, if_metageneration_not_match={"value": 3}, projection=CommonEnums.Projection.FULL, ) request = storage_pb2.InsertObjectRequest( insert_object_spec=insert_object_spec, write_offset=0) upload = gcs.holder.DataHolder.init_resumable_grpc(request, bucket, "") self.assertEqual(upload.metadata, resources_pb2.Object(name="object", bucket="bucket")) predefined_acl = utils.acl.extract_predefined_acl( upload.request, False, "") self.assertEqual( predefined_acl, CommonEnums.PredefinedObjectAcl.OBJECT_ACL_PROJECT_PRIVATE) match, not_match = utils.generation.extract_precondition( upload.request, False, False, "") self.assertIsNone(match) self.assertEqual(not_match, 1) match, not_match = utils.generation.extract_precondition( upload.request, True, False, "") self.assertEqual(match, 2) self.assertEqual(not_match, 3) projection = utils.common.extract_projection(upload.request, False, "") self.assertEqual(projection, CommonEnums.Projection.FULL)
def test_grpc_to_rest(self): # Make sure that object created by `gRPC` works with `REST`'s request. spec = storage_pb2.InsertObjectSpec(resource=resources_pb2.Object( name="test-object-name", bucket="bucket", metadata={"label0": "value0"}, cache_control="no-cache", content_disposition="test-value", content_encoding="test-value", content_language="test-value", content_type="octet-stream", storage_class="regional", customer_encryption=resources_pb2.Object.CustomerEncryption( encryption_algorithm="AES", key_sha256="123456"), # TODO(#6982) - add these fields when moving to storage/v2 # custom_time=utils.common.rest_rfc3339_to_proto("2021-08-01T12:00:00Z"), event_based_hold={"value": True}, kms_key_name="test-value", retention_expiration_time=utils.common.rest_rfc3339_to_proto( "2022-01-01T00:00:00Z"), temporary_hold=True, time_deleted=utils.common.rest_rfc3339_to_proto( "2021-06-01T00:00:00Z"), time_storage_class_updated=utils.common.rest_rfc3339_to_proto( "2021-07-01T00:00:00Z"), )) request = storage_pb2.StartResumableWriteRequest( insert_object_spec=spec) upload = gcs.holder.DataHolder.init_resumable_grpc( request, self.bucket.metadata, "") blob, _ = gcs.object.Object.init(upload.request, upload.metadata, b"123456789", upload.bucket, False, "") self.assertDictEqual(blob.rest_only, {}) self.assertEqual(blob.metadata.bucket, "bucket") self.assertEqual(blob.metadata.name, "test-object-name") self.assertEqual(blob.media, b"123456789") # `REST` GET rest_metadata = blob.rest_metadata() self.assertEqual(rest_metadata["bucket"], "bucket") self.assertEqual(rest_metadata["name"], "test-object-name") self.assertIsNone(blob.metadata.metadata.get("method")) # Verify the ObjectAccessControl entries have the desired fields acl = rest_metadata.pop("acl", None) self.assertIsNotNone(acl) for entry in acl: self.assertEqual(entry.pop("kind", None), "storage#objectAccessControl") self.assertEqual(entry.pop("bucket", None), "bucket") self.assertEqual(entry.pop("object", None), "test-object-name") self.assertIsNotNone(entry.pop("entity", None)) self.assertIsNotNone(entry.pop("role", None)) # Verify the remaining keys are a subset of the expected keys self.assertLessEqual( set(entry.keys()), set([ "id", "selfLink", "generation", "email", "entityId", "domain", "projectTeam", "etag", ]), ) # Some fields we only care that they exist. for key in self.__REST_FIELDS_KEY_ONLY: self.assertIsNotNone(rest_metadata.pop(key, None), msg="key=%s" % key) # Some fields we need to manually extract to check their values generation = rest_metadata.pop("generation", None) self.assertIsNotNone(generation) self.assertEqual("bucket/o/test-object-name#" + generation, rest_metadata.pop("id")) self.maxDiff = None self.assertDictEqual( rest_metadata, { "kind": "storage#object", "bucket": "bucket", "name": "test-object-name", "cacheControl": "no-cache", "contentDisposition": "test-value", "contentEncoding": "test-value", "contentLanguage": "test-value", "contentType": "octet-stream", "eventBasedHold": True, "crc32c": "4waSgw==", "customerEncryption": { "encryptionAlgorithm": "AES", "keySha256": "123456", }, "kmsKeyName": "test-value", "md5Hash": "JfnnlDI7RTiF9RgfG2JNCw==", "metadata": { "label0": "value0", # The emulator adds useful annotations "x_emulator_upload": "resumable", "x_emulator_no_crc32c": "true", "x_emulator_no_md5": "true", "x_testbench_upload": "resumable", "x_testbench_no_crc32c": "true", "x_testbench_no_md5": "true", }, "metageneration": "1", "retentionExpirationTime": "2022-01-01T00:00:00Z", "size": "9", "storageClass": "regional", "temporaryHold": True, }, ) # `REST` PATCH request = utils.common.FakeRequest( args={}, data=json.dumps({"metadata": { "method": "rest" }})) blob.patch(request, None) self.assertEqual(blob.metadata.metadata["method"], "rest")