Я собираюсь установить метку диска для экземпляра Google Compute Engine. В основном то, что задокументировано здесь:
https://cloud.google.com/compute/docs/reference/rest/v1/disks/setLabels
К сожалению, также с использованием простого кода, предоставленного Google:
require_once __DIR__ . '/vendor/autoload.php';
$client = new Google_Client();
$client->setApplicationName('Google-ComputeSample/0.1');
$client->useApplicationDefaultCredentials();
$client->addScope('https://www.googleapis.com/auth/cloud-platform');
$service = new Google_Service_Compute($client);
$project = 'my-project';
$zone = 'my-zone';
$resource = 'my-resource'; // here i set the disk name
$requestBody = new Google_Service_Compute_ZoneSetLabelsRequest();
$response = $service->disks->setLabels($project, $zone, $resource, $requestBody);
echo '<pre>', var_export($response, true), '</pre>', "\n";
?>
Я всегда сталкиваюсь с ошибкой 500:
Uncaught Google_Service_Exception: { "error": { "errors": [ { "domain": "global", "reason": "conditionNotMet", "message": "Labels fingerprint either invalid or resource labels have changed", "locationType": "header", "location": "If-Match" } ], "code": 412, "message": "Labels fingerprint either invalid or resource labels have changed" } }
где я предполагаю, что у меня неправильный синтаксис метки. Но в методе метки я пробовал несколько синтаксисов:
$requestBody->setLabels(array("mylabel"=>"1"));
$requestBody->setLabels(serialize(array("mylabel"=>"1")));
$requestBody->setLabels('"mylabel":"1"');
$requestBody->setLabels('{"mylabel":"1"}');
но ни один не работает. И ничего не изменилось (всегда 500 ошибка с тем же исключением). Что я сделал не так?
Ответ об ошибке, который вы получаете, указывает на то, что labelFingerprint неверен или не установлен. Тело запроса должно содержать как метки, так и labelFingerprint, и похоже, что вы устанавливаете только первое:
{
"labels": {
string: string,
...
},
"labelFingerprint": string
}
Документация, на которую вы ссылаетесь, объясняет, что такое labelFingerprint:
The fingerprint of the previous set of labels for this resource, used to detect conflicts. The fingerprint is initially generated by Compute Engine and changes after every request to modify or update labels. You must always provide an up-to-date fingerprint hash in order to update or change labels. Make a get() request to the resource to get the latest fingerprint.
A base64-encoded string.
Это здорово, рад, что смог помочь. Вы можете принять ответ, если хотите!
Конечно. извините, я забыл сделать это раньше!
Спасибо за ваш отзыв. Вы меня в правильном направлении, чтобы решить проблему.