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,32 @@
# -*- 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 Storage folders commands."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.calliope import base
@base.DefaultUniverseOnly
class Folders(base.Group):
"""Manage Cloud Storage folders."""
def Filter(self, context, args):
# TODO(b/190541521): Determine if command group works with project number
base.RequireProjectID(args)
del context, args

View File

@@ -0,0 +1,76 @@
# -*- 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.
"""Implementation of create command for making folders in HNS buckets."""
from googlecloudsdk.api_lib.storage import api_factory
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.storage import errors_util
from googlecloudsdk.command_lib.storage import flags
from googlecloudsdk.command_lib.storage import storage_url
from googlecloudsdk.core import log
@base.DefaultUniverseOnly
class Create(base.Command):
"""Create folders for hierarchical namespace bucket."""
detailed_help = {
'DESCRIPTION': 'Create folders.',
'EXAMPLES': """
The following command creates a folder called `folder/` in a bucket
named `my-bucket`:
$ {command} gs://my-bucket/folder/
The following command creates all folders in the path `A/B/C/D` in a
bucket named `my-bucket`:
$ {command} --recursive gs://my-bucket/folder/A/B/C/D
""",
}
@staticmethod
def Args(parser):
"""Adds arguments specific to this command to parser."""
parser.add_argument(
'url', type=str, nargs='+', help='The URLs of the folders to create.'
)
parser.add_argument(
'--recursive',
action='store_true',
help=(
'Recursively create all folders in a given path if they do not'
' alraedy exist.'
),
)
flags.add_additional_headers_flag(parser)
def Run(self, args):
urls = []
for url_string in args.url:
url = storage_url.storage_url_from_string(url_string)
errors_util.raise_error_if_not_gcs_folder_type(
args.command_path, url, 'folder'
)
urls.append(url)
for url in urls:
client = api_factory.get_api(url.scheme)
log.status.Print('Creating {}...'.format(url))
client.create_folder(url.bucket_name, url.resource_name, args.recursive)

View File

@@ -0,0 +1,72 @@
# -*- 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.
"""Implementation of command for deleting folders."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.storage import errors_util
from googlecloudsdk.command_lib.storage import flags
from googlecloudsdk.command_lib.storage import folder_util
from googlecloudsdk.command_lib.storage import name_expansion
from googlecloudsdk.command_lib.storage import rm_command_util
from googlecloudsdk.command_lib.storage import storage_url
from googlecloudsdk.command_lib.storage.tasks import task_graph_executor
@base.DefaultUniverseOnly
class Delete(base.Command):
"""Delete folders."""
detailed_help = {
'DESCRIPTION': """Delete folders.""",
'EXAMPLES': """
The following command deletes a folder named `folder`
in a hierarchical namesapce bucket
called `my-bucket`:
$ {command} gs://my-bucket/folder/
""",
}
@staticmethod
def Args(parser):
parser.add_argument(
'urls',
type=str,
nargs='+',
help='The URLs of the folders to delete.',
)
flags.add_additional_headers_flag(parser)
def Run(self, args):
for url_string in args.urls:
url = storage_url.storage_url_from_string(url_string)
errors_util.raise_error_if_not_gcs_folder_type(
args.command_path, url, 'folder'
)
folder_expansion_iterator = name_expansion.NameExpansionIterator(
args.urls,
folder_setting=folder_util.FolderSetting.LIST_WITHOUT_OBJECTS,
raise_error_for_unmatched_urls=True,
)
self.exit_code = rm_command_util.remove_folders(
folder_expansion_iterator,
task_status_queue=task_graph_executor.multiprocessing_context.Queue(),
raise_error_for_unmatched_urls=True,
)

View File

@@ -0,0 +1,68 @@
# -*- 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.
"""Implementation of create command for making folders in HNS buckets."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.api_lib.storage import api_factory
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.storage import errors_util
from googlecloudsdk.command_lib.storage import flags
from googlecloudsdk.command_lib.storage import storage_url
from googlecloudsdk.command_lib.storage.resources import full_resource_formatter
from googlecloudsdk.command_lib.storage.resources import resource_util
@base.DefaultUniverseOnly
class Describe(base.DescribeCommand):
"""Describe hierarchical namesapace bucket folders."""
detailed_help = {
'DESCRIPTION': """Describe hierarchical namespace bucket folders.""",
'EXAMPLES': """
The following command shows information about a folder named
`folder` in an hierarchical namespace bucket called `my-bucket`:
$ {command} gs://my-bucket/folder/
""",
}
@staticmethod
def Args(parser):
parser.add_argument(
'url',
type=str,
help='The URL of the folder to describe.',
)
flags.add_additional_headers_flag(parser)
flags.add_raw_display_flag(parser)
def Run(self, args):
url = storage_url.storage_url_from_string(args.url)
errors_util.raise_error_if_not_gcs_folder_type(
args.command_path, url, 'folder'
)
client = api_factory.get_api(url.scheme)
resource = client.get_folder(
url.bucket_name,
url.resource_name,
)
return resource_util.get_display_dict_for_resource(
resource,
full_resource_formatter.FolderDisplayTitlesAndDefaults,
display_raw_keys=args.raw,
)

View File

@@ -0,0 +1,85 @@
# -*- 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.
"""Implementation of command for listing folders."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.storage import errors_util
from googlecloudsdk.command_lib.storage import flags
from googlecloudsdk.command_lib.storage import folder_util
from googlecloudsdk.command_lib.storage import storage_url
from googlecloudsdk.command_lib.storage import wildcard_iterator
from googlecloudsdk.command_lib.storage.resources import full_resource_formatter
from googlecloudsdk.command_lib.storage.resources import resource_util
@base.DefaultUniverseOnly
class List(base.ListCommand):
"""List folders."""
detailed_help = {
'DESCRIPTION': """List folders.""",
'EXAMPLES': """
The following command lists all folders in a hierarchical namespace bucket:
$ {command} gs://my-bucket/
The following command lists all folders under a parent folder:
$ {command} gs://my-bucket/parent-folder/
You can use [wildcards](https://cloud.google.com/storage/docs/wildcards)
to match multiple paths (including multiple buckets). Bucket wildcards are
expanded to match only buckets contained in your current project. The
following command matches folders that are stored in buckets
in your project that begin with ``my-b'':
$ {command} gs://my-b*/
Following is another example where we are listing all folders that
begin with ``B'' under a given bucket:
$ {command} gs://my-bucket/B*
""",
}
@staticmethod
def Args(parser):
parser.add_argument(
'url', type=str, nargs='+', help='The URLs of the resources to list.'
)
flags.add_additional_headers_flag(parser)
flags.add_raw_display_flag(parser)
def Run(self, args):
urls = []
for url_string in args.url:
url = storage_url.storage_url_from_string(url_string)
errors_util.raise_error_if_not_gcs(args.command_path, url)
urls.append(url)
for url in urls:
for resource in wildcard_iterator.CloudWildcardIterator(
url.join('**'),
folder_setting=folder_util.FolderSetting.LIST_WITHOUT_OBJECTS,
):
yield resource_util.get_display_dict_for_resource(
resource,
full_resource_formatter.FolderDisplayTitlesAndDefaults,
display_raw_keys=args.raw,
)