feat: Add new gcloud commands, API clients, and third-party libraries across various services.

This commit is contained in:
2026-01-01 20:26:35 +01:00
parent 5e23cbece0
commit a19e592eb7
25221 changed files with 8324611 additions and 0 deletions

View File

@@ -0,0 +1,29 @@
# -*- coding: utf-8 -*- #
# Copyright 2021 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.
"""The volumes command group for the Bare Metal Solution CLI."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.calliope import base
@base.ReleaseTracks(base.ReleaseTrack.ALPHA, base.ReleaseTrack.GA)
class Volumes(base.Group):
"""Manage bare metal volumes in Bare Metal Solution."""
pass

View File

@@ -0,0 +1,55 @@
# -*- coding: utf-8 -*- #
# Copyright 2021 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.
"""'Bare Metal Solution volumes describe command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.api_lib.bms.bms_client import BmsClient
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.bms import flags
DETAILED_HELP = {
'DESCRIPTION':
"""
Describe a Bare Metal Solution volume.
""",
'EXAMPLES':
"""
To get a description of an volume called ``my-volume'' in
project ``my-project'' and region ``us-central1'', run:
$ {command} my-volume --project=my-project --region=us-central1
""",
}
@base.ReleaseTracks(base.ReleaseTrack.ALPHA, base.ReleaseTrack.GA)
class Describe(base.DescribeCommand):
"""Describe a Bare Metal Solution volume."""
@staticmethod
def Args(parser):
"""Register flags for this command."""
flags.AddVolumeArgToParser(parser, positional=True)
def Run(self, args):
volume = args.CONCEPTS.volume.Parse()
client = BmsClient()
return client.GetVolume(volume)
Describe.detailed_help = DETAILED_HELP

View File

@@ -0,0 +1,76 @@
# -*- coding: utf-8 -*- #
# Copyright 2021 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.
"""'Bare Metal Solution volumes list command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.api_lib.bms.bms_client import BmsClient
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.bms import flags
from googlecloudsdk.command_lib.bms import util
DETAILED_HELP = {
'DESCRIPTION':
"""
List Bare Metal Solution volumes in a project.
""",
'EXAMPLES':
"""
To list volumes within the project in the region ``us-central1'', run:
$ {command} --region=us-central1
Or:
To list all volumes in the project, run:
$ {command}
""",
}
@base.ReleaseTracks(base.ReleaseTrack.ALPHA, base.ReleaseTrack.GA)
class List(base.ListCommand):
"""List Bare Metal Solution volumes in a project."""
@staticmethod
def Args(parser):
"""Register flags for this command."""
# Remove unsupported default List flags.
base.FILTER_FLAG.RemoveFromParser(parser)
base.PAGE_SIZE_FLAG.RemoveFromParser(parser)
base.SORT_BY_FLAG.RemoveFromParser(parser)
base.URI_FLAG.RemoveFromParser(parser)
flags.FILTER_FLAG_NO_SORTBY_DOC.AddToParser(parser)
flags.AddRegionArgToParser(parser)
# The default format picks out the components of the relative name:
# given projects/myproject/locations/us-central1/volumes/my-test
# it takes -1 (my-test), -3 (us-central1), and -5 (myproject).
parser.display_info.AddFormat(
'table(name.segment(-1):label=NAME,id:label=ID,'
'name.segment(-5):label=PROJECT,name.segment(-3):label=REGION,'
'requestedSizeGib,storageType,state)')
def Run(self, args):
region = util.FixParentPathWithGlobalRegion(args.CONCEPTS.region.Parse())
client = BmsClient()
return client.ListVolumes(region, limit=args.limit)
List.detailed_help = DETAILED_HELP

View File

@@ -0,0 +1,27 @@
# -*- coding: utf-8 -*- #
# Copyright 2021 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.
"""The luns command group for the Bare Metal Solution CLI."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.calliope import base
@base.ReleaseTracks(base.ReleaseTrack.ALPHA, base.ReleaseTrack.GA)
class LUNs(base.Group):
"""Manage bare metal logical unit numbers (LUNs) in Bare Metal Solution."""

View File

@@ -0,0 +1,55 @@
# -*- coding: utf-8 -*- #
# Copyright 2021 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.
"""'Bare Metal Solution LUNs describe command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.api_lib.bms.bms_client import BmsClient
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.bms import flags
DETAILED_HELP = {
'DESCRIPTION':
"""
Describe a Bare Metal Solution logical unit number (LUN).
""",
'EXAMPLES':
"""
To get details about a LUN called ``my-lun'' on volume ``my-volume''
in region ``us-central1'', run:
$ {command} my-lun --region=us-central1 --volume=my-volume
""",
}
@base.ReleaseTracks(base.ReleaseTrack.ALPHA, base.ReleaseTrack.GA)
class Describe(base.DescribeCommand):
"""Describe a Bare Metal Solution LUN."""
@staticmethod
def Args(parser):
"""Register flags for this command."""
flags.AddLunArgToParser(parser)
def Run(self, args):
lun = args.CONCEPTS.lun.Parse()
client = BmsClient()
return client.GetLUN(lun)
Describe.detailed_help = DETAILED_HELP

View File

@@ -0,0 +1,80 @@
# -*- coding: utf-8 -*- #
# Copyright 2021 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.
"""'Bare Metal Solution logical unit numbers (LUNs) list command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
import abc
from googlecloudsdk.api_lib.bms.bms_client import BmsClient
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.bms import flags
from googlecloudsdk.core import log
import six
DETAILED_HELP = {
'DESCRIPTION':
"""
List Bare Metal Solution logical unit numbers (LUNs) for a volume.
""",
'EXAMPLES':
"""
To list all LUNs on volume ``my-volume'' in region ``us-central1'',
run:
$ {command} --region=us-central1 --volume=my-volume
""",
}
@base.ReleaseTracks(base.ReleaseTrack.ALPHA, base.ReleaseTrack.GA)
class List(six.with_metaclass(abc.ABCMeta, base.CacheCommand)):
"""List Bare Metal Solution LUNs in a project."""
@staticmethod
def Args(parser):
"""Register flags for this command."""
# Remove unsupported default List flags.
flags.FILTER_FLAG_NO_SORTBY_DOC.AddToParser(parser)
flags.LIMIT_FLAG_NO_SORTBY_DOC.AddToParser(parser)
flags.AddVolumeArgToParser(parser)
# The default format picks out the components of the relative name: given
# projects/myproject/locations/us-central1/volumes/my-volume/snapshots/my-snapshot
# it takes -1 (my-snapshot), -3 (my-volume), -5 (us-central1), and
# -7 (myproject)
parser.display_info.AddFormat(
'table(name.segment(-1):label=NAME,id:label=ID,'
'name.segment(-5):label=REGION,'
'name.segment(-3):label=VOLUME,sizeGb,state)')
def Run(self, args):
volume = args.CONCEPTS.volume.Parse()
client = BmsClient()
return client.ListLUNsForVolume(volume,
limit=args.limit)
def Epilog(self, resources_were_displayed):
"""Called after resources are displayed if the default format was used.
Args:
resources_were_displayed: True if resources were displayed.
"""
if not resources_were_displayed:
log.status.Print('Listed 0 items.')
List.detailed_help = DETAILED_HELP

View File

@@ -0,0 +1,61 @@
# -*- coding: utf-8 -*- #
# Copyright 2023 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.
"""Bare Metal Solution volume rename command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.api_lib.bms.bms_client import BmsClient
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.bms import flags
from googlecloudsdk.core import log
DETAILED_HELP = {
'DESCRIPTION':
"""
Rename a Bare Metal Solution volume.
""",
'EXAMPLES':
"""
To rename a volume ``my-volume'' to ``my-new-volume-name'' in region ``us-central1'', run:
$ {command} my-volume --new-name=my-new-volume-name --region=us-central1 --project=bms-example-project
""",
}
@base.ReleaseTracks(base.ReleaseTrack.ALPHA, base.ReleaseTrack.GA)
class Rename(base.UpdateCommand):
"""Rename a Bare Metal Solution volume."""
@staticmethod
def Args(parser):
"""Register flags for this command."""
flags.AddVolumeArgToParser(parser, positional=True)
flags.AddNewNameArgToParser(parser, 'volume')
def Run(self, args):
client = BmsClient()
old_name = args.CONCEPTS.volume.Parse()
new_name = args.new_name
res = client.RenameVolume(old_name, new_name)
log.status.Print(
'Renamed {} to {} successfully'.format(old_name.Name(), new_name))
return res
Rename.detailed_help = DETAILED_HELP

View File

@@ -0,0 +1,95 @@
# -*- coding: utf-8 -*- #
# Copyright 2021 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.
"""'Bare Metal Solution boot volumes "restore" command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.api_lib.bms.bms_client import BmsClient
from googlecloudsdk.api_lib.util import waiter
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.bms import flags
from googlecloudsdk.core import log
from googlecloudsdk.core import properties
from googlecloudsdk.core import resources
DETAILED_HELP = {
'DESCRIPTION':
"""
Restore a Bare Metal Solution boot volume from an existing snapshot.
""",
'EXAMPLES':
"""
To restore a boot volume named ``my-boot-volume'' in region
``us-central1'' from snapshot named ``my-snapshot'', run:
$ {command} my-boot-volume --region=us-central1 --snapshot=my-snapshot
""",
}
@base.ReleaseTracks(base.ReleaseTrack.ALPHA, base.ReleaseTrack.GA)
class Restore(base.UpdateCommand):
"""Restore a Bare Metal Solution boot volume from an existing snapshot."""
@staticmethod
def Args(parser):
"""Register flags for this command."""
flags.AddVolumeArgToParser(parser, positional=True)
parser.add_argument('--snapshot',
required=True,
help='Name of the snapshot to restore.')
base.ASYNC_FLAG.AddToParser(parser)
def Run(self, args):
volume = args.CONCEPTS.volume.Parse()
client = BmsClient()
snapshot_ref = resources.REGISTRY.Parse(
args.snapshot,
params={
'projectsId': properties.VALUES.core.project.GetOrFail,
'locationsId': args.region,
'volumesId': args.volume,
},
collection='baremetalsolution.projects.locations.volumes.snapshots',
api_version='v2')
op_ref = client.RestoreVolumeSnapshot(
snapshot_name=snapshot_ref.RelativeName())
if op_ref.done:
log.RestoredResource(volume.Name(), kind='volume')
return op_ref
if args.async_:
log.status.Print('Restore request issued for [{}]\nCheck operation '
'[{}] for status.'.format(volume.Name(), op_ref.name))
return op_ref
op_resource = resources.REGISTRY.ParseRelativeName(
op_ref.name,
collection='baremetalsolution.projects.locations.operations',
api_version='v2')
poller = waiter.CloudOperationPollerNoResources(
client.operation_service)
res = waiter.WaitFor(poller, op_resource,
'Waiting for operation [{}] to complete'.format(
op_ref.name))
log.RestoredResource(volume.Name(), kind='volume')
return res
Restore.detailed_help = DETAILED_HELP

View File

@@ -0,0 +1,81 @@
# -*- coding: utf-8 -*- #
# Copyright 2021 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.
"""'Bare Metal Solution boot volumes "snapshot" command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.api_lib.bms.bms_client import BmsClient
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.bms import flags
from googlecloudsdk.core import log
from googlecloudsdk.core import properties
from googlecloudsdk.core import resources
DETAILED_HELP = {
'DESCRIPTION':
"""
Create a snapshot of a Bare Metal Solution boot volume.
""",
'EXAMPLES':
"""
To create a snapshot of a boot volume named ``my-boot-volume'' in
region ``us-central1'' with the name ``my-snapshot'' and description
``my-description'', run:
$ {command} my-boot-volume --region=us-central1 --snapshot-name=my-snapshot
--description=my-description
""",
}
@base.ReleaseTracks(base.ReleaseTrack.ALPHA, base.ReleaseTrack.GA)
class Create(base.CreateCommand):
"""Create a snapshot of a Bare Metal Solution boot volume."""
@staticmethod
def Args(parser):
"""Register flags for this command."""
flags.AddVolumeArgToParser(parser, positional=True)
parser.add_argument('--snapshot-name',
help='Name to assign to the created snapshot.',
required=True)
parser.add_argument('--description',
help='Textual description of the created snapshot.',
required=True)
def Run(self, args):
volume = args.CONCEPTS.volume.Parse()
client = BmsClient()
snapshot_ref = resources.REGISTRY.Parse(
args.snapshot_name,
params={
'projectsId': properties.VALUES.core.project.GetOrFail,
'locationsId': args.region,
'volumesId': args.volume,
},
collection='baremetalsolution.projects.locations.volumes.snapshots',
api_version='v2')
res = client.CreateVolumeSnapshot(resource=volume,
name=snapshot_ref.RelativeName(),
description=args.description)
log.CreatedResource(res.name, 'snapshot')
return res
Create.detailed_help = DETAILED_HELP

View File

@@ -0,0 +1,28 @@
# -*- coding: utf-8 -*- #
# Copyright 2021 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.
"""The snapshots command group for the Bare Metal Solution CLI."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.calliope import base
@base.ReleaseTracks(base.ReleaseTrack.ALPHA, base.ReleaseTrack.GA)
class Snapshots(base.Group):
"""Manage snapshots for Bare Metal Solution volumes."""
pass

View File

@@ -0,0 +1,72 @@
# -*- coding: utf-8 -*- #
# Copyright 2021 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.
"""'Bare Metal Solution boot volume snapshot delete command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.api_lib.bms.bms_client import BmsClient
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.bms import flags
from googlecloudsdk.core import log
from googlecloudsdk.core.console import console_io
DETAILED_HELP = {
'DESCRIPTION':
"""
Delete a Bare Metal Solution boot volume snapshot.
""",
'EXAMPLES':
"""
To delete a snapshot called ``my-snapshot'' on boot volume
``my-boot-volume'' in region ``us-central1'', run:
$ {command} my-snapshot --region=us-central1 --volume=my-boot-volume
""",
}
@base.ReleaseTracks(base.ReleaseTrack.ALPHA, base.ReleaseTrack.GA)
class Delete(base.DeleteCommand):
"""Delete a Bare Metal Solution boot volume snapshot."""
@staticmethod
def Args(parser):
"""Register flags for this command."""
flags.AddVolumeSnapshotArgToParser(parser, positional=True)
def Run(self, args):
snapshot = args.CONCEPTS.snapshot.Parse()
client = BmsClient()
snapshot_type = client.GetVolumeSnapshot(snapshot).type
if snapshot_type == client.messages.VolumeSnapshot.TypeValueValuesEnum.SCHEDULED:
console_io.PromptContinue(
message='Deleting a SCHEDULED snapshot of a boot volume '
'is unsafe and should only be done when necessary.',
prompt_string='Are you sure you want to delete snapshot {}'
.format(snapshot.Name()),
cancel_on_no=True)
else:
console_io.PromptContinue(
message=('You are about to delete the snapshot '
'[{0}]'.format(snapshot.Name())),
cancel_on_no=True)
res = client.DeleteVolumeSnapshot(snapshot)
log.DeletedResource(snapshot.Name(), 'snapshot')
return res
Delete.detailed_help = DETAILED_HELP

View File

@@ -0,0 +1,57 @@
# -*- coding: utf-8 -*- #
# Copyright 2021 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.
"""'Bare Metal Solution snapshot describe command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.api_lib.bms.bms_client import BmsClient
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.bms import flags
DETAILED_HELP = {
'DESCRIPTION':
"""
Describe a Bare Metal Solution boot volume snapshot.
""",
'EXAMPLES':
"""
To get a description of a snapshot called ``my-snapshot'' on boot
volume ``my-boot-volume'' in region ``us-central1'',
run:
$ {command} my-snapshot --region=us-central1 --volume=my-boot-volume
""",
}
@base.ReleaseTracks(base.ReleaseTrack.ALPHA, base.ReleaseTrack.GA)
class Describe(base.DescribeCommand):
"""Describe a Bare Metal Solution boot volume snapshot."""
@staticmethod
def Args(parser):
"""Register flags for this command."""
flags.AddVolumeSnapshotArgToParser(parser, positional=True)
def Run(self, args):
snapshot = args.CONCEPTS.snapshot.Parse()
client = BmsClient()
return client.GetVolumeSnapshot(snapshot)
Describe.detailed_help = DETAILED_HELP

View File

@@ -0,0 +1,84 @@
# -*- coding: utf-8 -*- #
# Copyright 2021 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.
"""'Bare Metal Solution snapshots list command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
import abc
from googlecloudsdk.api_lib.bms.bms_client import BmsClient
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.bms import flags
from googlecloudsdk.core import log
import six
DETAILED_HELP = {
'DESCRIPTION':
"""
List snapshots for a Bare Metal Solution boot volume.
""",
'EXAMPLES':
"""
To list snapshots on boot volume ``my-boot-volume'' in region
``us-central1'', run:
$ {command} --region=us-central1 --volume=my-boot-volume
""",
}
@base.ReleaseTracks(base.ReleaseTrack.ALPHA, base.ReleaseTrack.GA)
class List(six.with_metaclass(abc.ABCMeta, base.CacheCommand)):
"""List snapshots for a Bare Metal Solution boot volume."""
@staticmethod
def Args(parser):
"""Register flags for this command."""
# Remove unsupported default List flags.
flags.FILTER_FLAG_NO_SORTBY_DOC.AddToParser(parser)
flags.LIMIT_FLAG_NO_SORTBY_DOC.AddToParser(parser)
flags.AddVolumeArgToParser(
parser,
group_help_text='The Bare Metal Solution volume to list snapshots of.')
# The default format picks out the components of the relative name: given
# projects/myproject/locations/us-central1/volumes/my-volume/snapshots/my-snapshot
# it takes -1 (my-snapshot), -3 (my-volume), -5 (us-central1), and
# -7 (myproject)
parser.display_info.AddFormat(
'table(name.segment(-1):label=NAME,id:label=ID,'
'name.segment(-5):label=REGION,'
'name.segment(-3):label=VOLUME,description,createTime,type)')
def Run(self, args):
volume = args.CONCEPTS.volume.Parse()
client = BmsClient()
return client.ListSnapshotsForVolume(volume,
limit=args.limit)
def Epilog(self, resources_were_displayed):
"""Called after resources are displayed if the default format was used.
Args:
resources_were_displayed: True if resources were displayed.
"""
if not resources_were_displayed:
log.status.Print('Listed 0 items.')
List.detailed_help = DETAILED_HELP

View File

@@ -0,0 +1,108 @@
# -*- coding: utf-8 -*- #
# Copyright 2021 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.
"""Bare Metal Solution volumes update command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.api_lib.bms.bms_client import BmsClient
from googlecloudsdk.api_lib.util import waiter
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.bms import exceptions
from googlecloudsdk.command_lib.bms import flags
from googlecloudsdk.command_lib.util.args import labels_util
from googlecloudsdk.core import log
from googlecloudsdk.core import resources
DETAILED_HELP = {
'DESCRIPTION':
"""
Update a Bare Metal Solution volume.
This call returns immediately, but the update operation may take
several minutes to complete. To check if the operation is complete,
use the `describe` command for the volume.
""",
'EXAMPLES':
"""
To add the label 'key1=value1' to a policy, run:
$ {command} my-volume --update-labels=key1=value1
To clear all labels, run:
$ {command} my-volume --clear-labels
""",
}
@base.ReleaseTracks(base.ReleaseTrack.ALPHA, base.ReleaseTrack.GA)
class Update(base.UpdateCommand):
"""Update a Bare Metal Solution volume."""
@staticmethod
def Args(parser):
"""Register flags for this command."""
flags.AddVolumeArgToParser(parser, positional=True)
labels_util.AddUpdateLabelsFlags(parser)
base.ASYNC_FLAG.AddToParser(parser)
def Run(self, args):
client = BmsClient()
volume = args.CONCEPTS.volume.Parse()
labels_update = None
labels_diff = labels_util.Diff.FromUpdateArgs(args)
if not labels_diff.MayHaveUpdates():
raise exceptions.NoConfigurationChangeError(
'No configuration change was requested. Did you mean to include the '
'flags `--update-labels`, `--remove-labels`, or `--clear-labels?`')
orig_resource = client.GetVolume(volume)
labels_update = labels_diff.Apply(
client.messages.Volume.LabelsValue,
orig_resource.labels).GetOrNone()
op_ref = client.UpdateVolume(
volume_resource=volume,
labels=labels_update,
snapshot_schedule_policy_resource=None,
remove_snapshot_schedule_policy=None,
snapshot_auto_delete=None)
if op_ref.done:
log.UpdatedResource(volume.Name(), kind='volume')
return op_ref
if args.async_:
log.status.Print('Update request issued for: [{}]\nCheck operation '
'[{}] for status.'.format(volume.Name(), op_ref.name))
return op_ref
op_resource = resources.REGISTRY.ParseRelativeName(
op_ref.name,
collection='baremetalsolution.projects.locations.operations',
api_version='v2')
poller = waiter.CloudOperationPollerNoResources(
client.operation_service)
res = waiter.WaitFor(poller, op_resource,
'Waiting for operation [{}] to complete'.format(
op_ref.name))
log.UpdatedResource(volume.Name(), kind='volume')
return res
Update.detailed_help = DETAILED_HELP