in monitoring/src/alert_restore_policies.php [43:159]
function alert_restore_policies(string $projectId): void
{
$alertClient = new AlertPolicyServiceClient([
'projectId' => $projectId,
]);
$channelClient = new NotificationChannelServiceClient([
'projectId' => $projectId,
]);
print('Loading alert policies and notification channels from backup.json.' . PHP_EOL);
$projectName = 'projects/' . $projectId;
$record = json_decode((string) file_get_contents('backup.json'), true);
$isSameProject = $projectName == $record['project_name'];
# Convert dicts to AlertPolicies.
$policies = [];
foreach ($record['policies'] as $policyArray) {
$policy = new AlertPolicy();
$policy->mergeFromJsonString((string) json_encode($policyArray));
$policies[] = $policy;
}
# Convert dicts to NotificationChannels
$channels = [];
foreach (array_filter($record['channels']) as $channelArray) {
$channel = new NotificationChannel();
$channel->mergeFromJsonString((string) json_encode($channelArray));
$channels[] = $channel;
}
# Restore the channels.
$channelNameMap = [];
foreach ($channels as $channel) {
$updated = false;
printf('Updating channel %s' . PHP_EOL, $channel->getDisplayName());
# This field is immutable and it is illegal to specify a
# non-default value (UNVERIFIED or VERIFIED) in the
# Create() or Update() operations.
$channel->setVerificationStatus(
VerificationStatus::VERIFICATION_STATUS_UNSPECIFIED
);
if ($isSameProject) {
try {
$updateNotificationChannelRequest = (new UpdateNotificationChannelRequest())
->setNotificationChannel($channel);
$channelClient->updateNotificationChannel($updateNotificationChannelRequest);
$updated = true;
} catch (ApiException $e) {
# The channel was deleted. Create it below.
if ($e->getStatus() !== 'NOT_FOUND') {
throw $e;
}
}
}
if (!$updated) {
# The channel no longer exists. Recreate it.
$oldName = $channel->getName();
$channel->setName('');
$createNotificationChannelRequest = (new CreateNotificationChannelRequest())
->setName($projectName)
->setNotificationChannel($channel);
$newChannel = $channelClient->createNotificationChannel($createNotificationChannelRequest);
$channelNameMap[$oldName] = $newChannel->getName();
}
}
# Restore the alerts
foreach ($policies as $policy) {
printf('Updating policy %s' . PHP_EOL, $policy->getDisplayName());
# These two fields cannot be set directly, so clear them.
$policy->clearCreationRecord();
$policy->clearMutationRecord();
$notificationChannels = $policy->getNotificationChannels();
# Update old channel names with new channel names.
foreach ($notificationChannels as $i => $channel) {
if (isset($channelNameMap[$channel])) {
$notificationChannels[$i] = $channelNameMap[$channel];
}
}
$updated = false;
if ($isSameProject) {
try {
$updateAlertPolicyRequest = (new UpdateAlertPolicyRequest())
->setAlertPolicy($policy);
$alertClient->updateAlertPolicy($updateAlertPolicyRequest);
$updated = true;
} catch (ApiException $e) {
# The policy was deleted. Create it below.
if ($e->getStatus() !== 'NOT_FOUND') {
throw $e;
}
}
}
if (!$updated) {
# The policy no longer exists. Recreate it.
$oldName = $policy->getName();
$policy->setName('');
foreach ($policy->getConditions() as $condition) {
$condition->setName('');
}
$createAlertPolicyRequest = (new CreateAlertPolicyRequest())
->setName($projectName)
->setAlertPolicy($policy);
$policy = $alertClient->createAlertPolicy($createAlertPolicyRequest);
}
printf('Updated %s' . PHP_EOL, $policy->getName());
}
print('Restored alert policies and notification channels from backup.json.');
}