コード例 #1
0
ファイル: test_gcs.py プロジェクト: vnvo2409/google-cloud-cpp
    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")
コード例 #2
0
 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)
コード例 #3
0
ファイル: test_gcs.py プロジェクト: vnvo2409/google-cloud-cpp
 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)
コード例 #4
0
    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")