160 lines
5.3 KiB
Python
160 lines
5.3 KiB
Python
# -*- coding: utf-8 -*- #
|
|
# Copyright 2024 Google LLC. All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
"""Cloud Spanner backup schedules API helper."""
|
|
|
|
from __future__ import absolute_import
|
|
from __future__ import division
|
|
from __future__ import unicode_literals
|
|
|
|
from apitools.base.py import list_pager
|
|
from googlecloudsdk.api_lib.util import apis
|
|
from googlecloudsdk.command_lib.spanner.resource_args import CloudKmsKeyName
|
|
from googlecloudsdk.core.util import times
|
|
|
|
|
|
def ParseAndFormatRetentionDuration(retention_duration):
|
|
return times.FormatDurationForJson(times.ParseDuration(retention_duration))
|
|
|
|
|
|
def CreateBackupScheduleMessage(
|
|
backup_schedule_ref,
|
|
args,
|
|
msgs,
|
|
encryption_type=None,
|
|
kms_key: CloudKmsKeyName = None,
|
|
):
|
|
"""Create a backup schedule message.
|
|
|
|
Args:
|
|
backup_schedule_ref: resource argument for a cloud spanner backup schedule.
|
|
args: an argparse namespace. All the arguments that were provided to command
|
|
invocation.
|
|
msgs: contains the definitions of messages for the spanner v1 API.
|
|
encryption_type: encryption type for the backup encryption.
|
|
kms_key: contains the encryption keys for the backup encryption.
|
|
|
|
Returns:
|
|
BackupSchedule message.
|
|
"""
|
|
backup_schedule = msgs.BackupSchedule(name=backup_schedule_ref.RelativeName())
|
|
|
|
if args.retention_duration:
|
|
backup_schedule.retentionDuration = ParseAndFormatRetentionDuration(
|
|
args.retention_duration
|
|
)
|
|
|
|
if encryption_type or kms_key:
|
|
encryption_config = msgs.CreateBackupEncryptionConfig()
|
|
if encryption_type:
|
|
encryption_config.encryptionType = encryption_type
|
|
if kms_key:
|
|
if kms_key.kms_key_name:
|
|
encryption_config.kmsKeyName = kms_key.kms_key_name
|
|
elif kms_key.kms_key_names:
|
|
encryption_config.kmsKeyNames = kms_key.kms_key_names
|
|
backup_schedule.encryptionConfig = encryption_config
|
|
|
|
if args.cron:
|
|
backup_schedule.spec = msgs.BackupScheduleSpec(
|
|
cronSpec=msgs.CrontabSpec(text=args.cron)
|
|
)
|
|
return backup_schedule
|
|
|
|
|
|
def Get(backup_schedule_ref):
|
|
"""Get a backup schedule."""
|
|
client = apis.GetClientInstance('spanner', 'v1')
|
|
msgs = apis.GetMessagesModule('spanner', 'v1')
|
|
req = msgs.SpannerProjectsInstancesDatabasesBackupSchedulesGetRequest(
|
|
name=backup_schedule_ref.RelativeName()
|
|
)
|
|
return client.projects_instances_databases_backupSchedules.Get(req)
|
|
|
|
|
|
def Delete(backup_schedule_ref):
|
|
"""Delete a backup schedule."""
|
|
client = apis.GetClientInstance('spanner', 'v1')
|
|
msgs = apis.GetMessagesModule('spanner', 'v1')
|
|
req = msgs.SpannerProjectsInstancesDatabasesBackupSchedulesDeleteRequest(
|
|
name=backup_schedule_ref.RelativeName()
|
|
)
|
|
return client.projects_instances_databases_backupSchedules.Delete(req)
|
|
|
|
|
|
def Create(
|
|
backup_schedule_ref,
|
|
args,
|
|
encryption_type,
|
|
kms_key,
|
|
):
|
|
"""Create a new backup schedule."""
|
|
client = apis.GetClientInstance('spanner', 'v1')
|
|
msgs = apis.GetMessagesModule('spanner', 'v1')
|
|
req = msgs.SpannerProjectsInstancesDatabasesBackupSchedulesCreateRequest(
|
|
parent=backup_schedule_ref.Parent().RelativeName()
|
|
)
|
|
req.backupSchedule = CreateBackupScheduleMessage(
|
|
backup_schedule_ref, args, msgs, encryption_type, kms_key
|
|
)
|
|
if args.backup_type[0] == 'full-backup':
|
|
req.backupSchedule.fullBackupSpec = msgs.FullBackupSpec()
|
|
elif args.backup_type[0] == 'incremental-backup':
|
|
req.backupSchedule.incrementalBackupSpec = msgs.IncrementalBackupSpec()
|
|
req.backupScheduleId = backup_schedule_ref.Name()
|
|
return client.projects_instances_databases_backupSchedules.Create(req)
|
|
|
|
|
|
def List(database_ref):
|
|
"""List backup schedules in the database."""
|
|
client = apis.GetClientInstance('spanner', 'v1')
|
|
msgs = apis.GetMessagesModule('spanner', 'v1')
|
|
req = msgs.SpannerProjectsInstancesDatabasesBackupSchedulesListRequest(
|
|
parent=database_ref.RelativeName()
|
|
)
|
|
return list_pager.YieldFromList(
|
|
client.projects_instances_databases_backupSchedules,
|
|
req,
|
|
field='backupSchedules',
|
|
batch_size_attribute='pageSize',
|
|
)
|
|
|
|
|
|
def Update(
|
|
backup_schedule_ref,
|
|
args,
|
|
encryption_type,
|
|
kms_key,
|
|
):
|
|
"""Update a backup schedule."""
|
|
client = apis.GetClientInstance('spanner', 'v1')
|
|
msgs = apis.GetMessagesModule('spanner', 'v1')
|
|
req = msgs.SpannerProjectsInstancesDatabasesBackupSchedulesPatchRequest(
|
|
name=backup_schedule_ref.RelativeName()
|
|
)
|
|
req.backupSchedule = CreateBackupScheduleMessage(
|
|
backup_schedule_ref, args, msgs, encryption_type, kms_key
|
|
)
|
|
|
|
update_mask_paths = []
|
|
if args.cron:
|
|
update_mask_paths.append('spec.cron_spec.text')
|
|
if args.retention_duration:
|
|
update_mask_paths.append('retention_duration')
|
|
if encryption_type or kms_key:
|
|
update_mask_paths.append('encryption_config')
|
|
req.updateMask = ','.join(update_mask_paths)
|
|
|
|
return client.projects_instances_databases_backupSchedules.Patch(req)
|