Как изменить класс хранения одного объекта в корзине GCS? - PullRequest
0 голосов
/ 17 января 2019

В настоящее время я пытаюсь написать некоторый код для перевода некоторых "региональных" объектов в "холодную линию" в корзине Google Storage, но я получаю следующее исключение:

{Хранилище службы выдало исключение: Google.GoogleApiException: Google.Apis.Requests.RequestError Неверный аргумент [400] Ошибки [ Сообщение [Неверный аргумент] Местоположение [-] Причина [неверный] Домен [глобальный] ]

в Google.Apis.Requests.ClientServiceRequest 1.ParseResponse(HttpResponseMessage response) in C:\Apiary\support1351\Src\Support\Google.Apis\Requests\ClientServiceRequest.cs:line 192 at Google.Apis.Requests.ClientServiceRequest 1.Execute () в C: \ Apiary \ support1351 \ Src \ Support \ Google.Apis \ Requests \ ClientServiceRequest.cs: строка 116 в Example.Core.Google.GoogleStorageHandler.Archive () в C: \ work \ team-api \ Example \ Example.Core.Google \ GoogleStorageHandler.cs: строка 365}

Мой код выглядит следующим образом:

StorageClient _storageClient;

string storageBucket = "testBucket";
string storageKey = "testFile";

// Test object setup code (added for this question to make the sample more complete)
using (var stream = new MemoryStream(new byte[] { 0x0, 0x1, 0x2, 0x3, 0x4 }))
{
    _storageClient.UploadObject(storageBucket, storageKey, null, stream);
}
// End of setup code

var objectData = _storageClient.GetObject(storageBucket, storageKey);
if (!string.Equals(objectData.StorageClass, "coldline", StringComparison.InvariantCultureIgnoreCase))
{
    objectData.StorageClass = "coldline";
    _storageClient.UpdateObject(objectData); // exception thrown here
}

Я подтвердил, что могу вносить другие изменения в метаданные того же объекта (например, заменив objectData.StorageClass на objectData.ContentType), но я не могу изменить класс хранилища. Единственная проблема, с которой я столкнулся, была эта , что привело к той же ошибке. К сожалению, я использую фиксированную версию SDK, которую рекомендовал Джон (2.2.1), так что, похоже, проблема не в этом. Я также пробовал использовать последнюю предварительную версию (2.3.0-beta04) и не вижу улучшений.

Я могу изменить класс StorageClass объекта с помощью gsutil, и это отражается, если я опрашиваю объект объект на странице получения объекта справки . Если я попытаюсь пропатчить с тем же storageClass, это сработает. Если я попытаюсь изменить storageClass, произойдет сбой и выдаст следующую ошибку 400:

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "invalid",
    "message": "Invalid argument"
   }
  ],
  "code": 400,
  "message": "Invalid argument"
 }
}

Учитывая, что gsutil может изменить его, я склонен полагать, что смогу сделать это через SDK или API, но я не могу. На этой странице указано, что поле storageClass доступно для записи. Я пропускаю некоторые другие данные, которые мне нужно включить? Кажется, нет никаких полезных перегрузок для UpdateObject, которые повлияют на мою ситуацию.

1 Ответ

0 голосов
/ 17 января 2019

Исходя из этой документации , я не думаю, что вы можете обновить класс хранилища напрямую с помощью патча или обновления. Вместо этого вам нужно выполнить операцию перезаписи на объекте.

В настоящее время мы не выставляем изменения непосредственно в Google.Cloud.Storage.V1, но вы должны иметь возможность использовать базовый сервис:

var obj = new Google.Apis.Storage.v1.Data.Object { StorageClass = "coldline" };
client.Service.Objects.Rewrite(obj, bucketName, objectName, bucketName, objectName).Execute();
...