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,27 @@
# -*- coding: utf-8 -*- #
# Copyright 2015 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 main command group for Cloud Pub/Sub topics."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.calliope import base
@base.UniverseCompatible
class Topics(base.Group):
"""Manage Cloud Pub/Sub topics."""
pass

View File

@@ -0,0 +1,56 @@
release_tracks: [ALPHA, BETA, GA]
help_text:
brief: Add IAM policy binding to a topic.
description: |
Add an IAM policy binding to a Cloud Pub/Sub Topic.
examples: |
To add an IAM policy binding with the role of 'roles/editor' for the user 'test-user@example.com'
on the topic 'my-topic', run:
$ {command} my-topic --member='user:test-user@example.com' --role='roles/editor'
To add an IAM policy binding with the role of 'roles/editor' for the service account
'my-iam-account@my-project.iam.gserviceaccount.com' on the topic 'my-topic', run:
$ {command} my-topic --member='serviceAccount:my-iam-account@my-project.iam.gserviceaccount.com' --role='roles/editor'
See https://cloud.google.com/iam/docs/managing-policies for details of
policy role and member types.
request:
collection: pubsub.projects.topics
arguments:
resource:
help_text: The topic to add the IAM policy binding.
spec: !REF googlecloudsdk.command_lib.pubsub.resources:topic
ALPHA:
help_text:
brief: Add IAM policy binding to a topic.
description: |
Add an IAM policy binding to the IAM policy of a Cloud Pub/Sub Topic. One binding consists of a member,
a role, and an optional condition.
examples: |
To add an IAM policy binding with the role of 'roles/editor' for the user
'test-user@example.com' on the topic 'my-topic', run:
$ {command} my-topic --member='user:test-user@example.com' --role='roles/editor'
To add an IAM policy binding with the role of 'roles/editor' for the service account
'my-iam-account@my-project.iam.gserviceaccount.com' on the topic 'my-topic', run:
$ {command} my-topic --member='serviceAccount:my-iam-account@my-project.iam.gserviceaccount.com' --role='roles/editor'
To add an IAM policy binding which expires at the end of the year 2018 for the role of
'roles/pubsub.publisher' and the user 'test-user@example.com' with topic 'my-topic', run:
$ {command} my-topic --member='user:test-user@example.com' --role='roles/pubsub.publisher' --condition='expression=request.time < timestamp("2019-01-01T00:00:00Z"),title=expires_end_of_2018,description=Expires at midnight on 2018-12-31'
See https://cloud.google.com/iam/docs/managing-policies for details of
policy role and member types.
iam:
enable_condition: true

View File

@@ -0,0 +1,26 @@
# -*- 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.
"""Command group for managing Pub/Sub topic configurations."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.calliope import base
@base.ReleaseTracks(base.ReleaseTrack.ALPHA)
class Config(base.Group):
"""Manage Pub/Sub topic configurations."""

View File

@@ -0,0 +1,38 @@
release_tracks: [ALPHA]
command_type: CONFIG_EXPORT
help_text:
brief: Export the configuration for a Pub/Sub topic.
description: |
*{command}* exports the configuration for a Pub/Sub topic.
Topic configurations can be exported in
Kubernetes Resource Model (krm) or Terraform HCL formats. The
default format is `krm`.
Specifying `--all` allows you to export the configurations for all
topics within the project.
Specifying `--path` allows you to export the configuration(s) to
a local directory.
examples: |
To export the configuration for a topic, run:
$ {command} my-topic
To export the configuration for a topic to a file, run:
$ {command} my-topic --path=/path/to/dir/
To export the configuration for a topic in Terraform
HCL format, run:
$ {command} my-topic --resource-format=terraform
To export the configurations for all topics within a
project, run:
$ {command} --all
arguments:
resource:
help_text: Topic to export the configuration for.
spec: !REF googlecloudsdk.command_lib.pubsub.resources:topic

View File

@@ -0,0 +1,337 @@
# -*- coding: utf-8 -*- #
# Copyright 2015 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 Pub/Sub topics create command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from apitools.base.py import exceptions as api_ex
from googlecloudsdk.api_lib.pubsub import topics
from googlecloudsdk.api_lib.util import exceptions
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.kms import resource_args as kms_resource_args
from googlecloudsdk.command_lib.pubsub import flags
from googlecloudsdk.command_lib.pubsub import resource_args
from googlecloudsdk.command_lib.pubsub import util
from googlecloudsdk.command_lib.util.args import labels_util
from googlecloudsdk.core import exceptions as core_exceptions
from googlecloudsdk.core import log
from googlecloudsdk.core import properties
_KMS_FLAG_OVERRIDES = {
'kms-key': '--topic-encryption-key',
'kms-keyring': '--topic-encryption-key-keyring',
'kms-location': '--topic-encryption-key-location',
'kms-project': '--topic-encryption-key-project',
}
_KMS_PERMISSION_INFO = """
The specified Cloud KMS key should have purpose set to "ENCRYPT_DECRYPT".
The service account,
"service-${CONSUMER_PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com"
requires the IAM cryptoKeyEncrypterDecrypter role for the given Cloud KMS key.
CONSUMER_PROJECT_NUMBER is the project number of the project that is the parent of the
topic being created"""
def _GetKmsKeyPresentationSpec():
return kms_resource_args.GetKmsKeyPresentationSpec(
'topic',
flag_overrides=_KMS_FLAG_OVERRIDES,
permission_info=_KMS_PERMISSION_INFO,
)
def _GetTopicPresentationSpec():
return resource_args.CreateTopicResourceArg(
'to create.', positional=True, plural=True
)
def _Run(args, /, *, legacy_output=False, enable_vertex_ai_smt=False):
"""Creates one or more topics."""
client = topics.TopicsClient()
labels = labels_util.ParseCreateArgs(args, client.messages.Topic.LabelsValue)
kms_key = None
kms_ref = args.CONCEPTS.kms_key.Parse()
if kms_ref:
kms_key = kms_ref.RelativeName()
else:
# Did user supply any topic-encryption-key flags?
for keyword in [
'topic-encryption-key',
'topic-encryption-key-project',
'topic-encryption-key-location',
'topic-encryption-key-keyring',
]:
if args.IsSpecified(keyword.replace('-', '_')):
raise core_exceptions.Error(
'--topic-encryption-key was not fully specified.'
)
retention_duration = getattr(args, 'message_retention_duration', None)
if args.IsSpecified('message_retention_duration'):
retention_duration = util.FormatDuration(retention_duration)
message_storage_policy_allowed_regions = (
args.message_storage_policy_allowed_regions
)
message_storage_policy_enforce_in_transit = getattr(
args, 'message_storage_policy_enforce_in_transit', None
)
schema = getattr(args, 'schema', None)
first_revision_id = None
last_revision_id = None
if schema:
schema = args.CONCEPTS.schema.Parse().RelativeName()
first_revision_id = getattr(args, 'first_revision_id', None)
last_revision_id = getattr(args, 'last_revision_id', None)
message_encoding_list = getattr(args, 'message_encoding', None)
message_encoding = None
if message_encoding_list:
message_encoding = message_encoding_list[0]
kinesis_ingestion_stream_arn = getattr(
args, 'kinesis_ingestion_stream_arn', None
)
kinesis_ingestion_consumer_arn = getattr(
args, 'kinesis_ingestion_consumer_arn', None
)
kinesis_ingestion_role_arn = getattr(args, 'kinesis_ingestion_role_arn', None)
kinesis_ingestion_service_account = getattr(
args, 'kinesis_ingestion_service_account', None
)
cloud_storage_ingestion_bucket = getattr(
args, 'cloud_storage_ingestion_bucket', None
)
cloud_storage_ingestion_input_format_list = getattr(
args, 'cloud_storage_ingestion_input_format', None
)
cloud_storage_ingestion_input_format = None
if cloud_storage_ingestion_input_format_list:
cloud_storage_ingestion_input_format = (
cloud_storage_ingestion_input_format_list[0]
)
cloud_storage_ingestion_text_delimiter = getattr(
args, 'cloud_storage_ingestion_text_delimiter', None
)
if cloud_storage_ingestion_text_delimiter:
# Interprets special characters representations (i.e., "\n") as their
# expected characters (i.e., newline).
cloud_storage_ingestion_text_delimiter = (
cloud_storage_ingestion_text_delimiter.encode('utf-8').decode(
'unicode-escape'
)
)
cloud_storage_ingestion_minimum_object_create_time = getattr(
args, 'cloud_storage_ingestion_minimum_object_create_time', None
)
cloud_storage_ingestion_match_glob = getattr(
args, 'cloud_storage_ingestion_match_glob', None
)
azure_event_hubs_ingestion_resource_group = getattr(
args, 'azure_event_hubs_ingestion_resource_group', None
)
azure_event_hubs_ingestion_namespace = getattr(
args, 'azure_event_hubs_ingestion_namespace', None
)
azure_event_hubs_ingestion_event_hub = getattr(
args, 'azure_event_hubs_ingestion_event_hub', None
)
azure_event_hubs_ingestion_client_id = getattr(
args, 'azure_event_hubs_ingestion_client_id', None
)
azure_event_hubs_ingestion_tenant_id = getattr(
args, 'azure_event_hubs_ingestion_tenant_id', None
)
azure_event_hubs_ingestion_subscription_id = getattr(
args, 'azure_event_hubs_ingestion_subscription_id', None
)
azure_event_hubs_ingestion_service_account = getattr(
args, 'azure_event_hubs_ingestion_service_account', None
)
aws_msk_ingestion_cluster_arn = getattr(
args, 'aws_msk_ingestion_cluster_arn', None
)
aws_msk_ingestion_topic = getattr(args, 'aws_msk_ingestion_topic', None)
aws_msk_ingestion_aws_role_arn = getattr(
args, 'aws_msk_ingestion_aws_role_arn', None
)
aws_msk_ingestion_service_account = getattr(
args, 'aws_msk_ingestion_service_account', None
)
confluent_cloud_ingestion_bootstrap_server = getattr(
args, 'confluent_cloud_ingestion_bootstrap_server', None
)
confluent_cloud_ingestion_cluster_id = getattr(
args, 'confluent_cloud_ingestion_cluster_id', None
)
confluent_cloud_ingestion_topic = getattr(
args, 'confluent_cloud_ingestion_topic', None
)
confluent_cloud_ingestion_identity_pool_id = getattr(
args, 'confluent_cloud_ingestion_identity_pool_id', None
)
confluent_cloud_ingestion_service_account = getattr(
args, 'confluent_cloud_ingestion_service_account', None
)
ingestion_log_severity = getattr(args, 'ingestion_log_severity', None)
message_transforms_file = getattr(args, 'message_transforms_file', None)
tags = flags.GetTagsMessage(args, client.messages.Topic.TagsValue)
failed = []
for topic_ref in args.CONCEPTS.topic.Parse():
try:
result = client.Create(
topic_ref,
labels=labels,
kms_key=kms_key,
message_retention_duration=retention_duration,
message_storage_policy_allowed_regions=message_storage_policy_allowed_regions,
message_storage_policy_enforce_in_transit=message_storage_policy_enforce_in_transit,
schema=schema,
message_encoding=message_encoding,
first_revision_id=first_revision_id,
last_revision_id=last_revision_id,
kinesis_ingestion_stream_arn=kinesis_ingestion_stream_arn,
kinesis_ingestion_consumer_arn=kinesis_ingestion_consumer_arn,
kinesis_ingestion_role_arn=kinesis_ingestion_role_arn,
kinesis_ingestion_service_account=kinesis_ingestion_service_account,
cloud_storage_ingestion_bucket=cloud_storage_ingestion_bucket,
cloud_storage_ingestion_input_format=cloud_storage_ingestion_input_format,
cloud_storage_ingestion_text_delimiter=cloud_storage_ingestion_text_delimiter,
cloud_storage_ingestion_minimum_object_create_time=cloud_storage_ingestion_minimum_object_create_time,
cloud_storage_ingestion_match_glob=cloud_storage_ingestion_match_glob,
azure_event_hubs_ingestion_resource_group=azure_event_hubs_ingestion_resource_group,
azure_event_hubs_ingestion_namespace=azure_event_hubs_ingestion_namespace,
azure_event_hubs_ingestion_event_hub=azure_event_hubs_ingestion_event_hub,
azure_event_hubs_ingestion_client_id=azure_event_hubs_ingestion_client_id,
azure_event_hubs_ingestion_tenant_id=azure_event_hubs_ingestion_tenant_id,
azure_event_hubs_ingestion_subscription_id=azure_event_hubs_ingestion_subscription_id,
azure_event_hubs_ingestion_service_account=azure_event_hubs_ingestion_service_account,
aws_msk_ingestion_cluster_arn=aws_msk_ingestion_cluster_arn,
aws_msk_ingestion_topic=aws_msk_ingestion_topic,
aws_msk_ingestion_aws_role_arn=aws_msk_ingestion_aws_role_arn,
aws_msk_ingestion_service_account=aws_msk_ingestion_service_account,
confluent_cloud_ingestion_bootstrap_server=confluent_cloud_ingestion_bootstrap_server,
confluent_cloud_ingestion_cluster_id=confluent_cloud_ingestion_cluster_id,
confluent_cloud_ingestion_topic=confluent_cloud_ingestion_topic,
confluent_cloud_ingestion_identity_pool_id=confluent_cloud_ingestion_identity_pool_id,
confluent_cloud_ingestion_service_account=confluent_cloud_ingestion_service_account,
ingestion_log_severity=ingestion_log_severity,
message_transforms_file=message_transforms_file,
tags=tags,
enable_vertex_ai_smt=enable_vertex_ai_smt,
)
except api_ex.HttpError as error:
exc = exceptions.HttpException(error)
log.CreatedResource(
topic_ref.RelativeName(),
kind='topic',
failed=util.CreateFailureErrorMessage(exc.payload.status_message),
)
failed.append(topic_ref.topicsId)
continue
if legacy_output:
result = util.TopicDisplayDict(result)
log.CreatedResource(topic_ref.RelativeName(), kind='topic')
yield result
if failed:
raise util.RequestsFailedError(failed, 'create')
def _Args(
parser,
):
"""Custom args implementation.
Args:
parser: The current parser.
"""
resource_args.AddResourceArgs(
parser, [_GetKmsKeyPresentationSpec(), _GetTopicPresentationSpec()]
)
# This group should not be hidden
flags.AddSchemaSettingsFlags(parser, is_update=False)
flags.AddIngestionDatasourceFlags(
parser,
is_update=False,
)
labels_util.AddCreateLabelsFlags(parser)
flags.AddTopicMessageRetentionFlags(parser, is_update=False)
flags.AddTopicMessageStoragePolicyFlags(parser, is_update=False)
flags.AddMessageTransformsFlags(parser)
flags.AddTagsFlag(parser)
@base.UniverseCompatible
@base.ReleaseTracks(base.ReleaseTrack.GA)
class Create(base.CreateCommand):
"""Creates one or more Cloud Pub/Sub topics."""
detailed_help = {'EXAMPLES': """\
To create a Cloud Pub/Sub topic, run:
$ {command} mytopic"""}
@staticmethod
def Args(parser):
_Args(
parser,
)
def Run(self, args):
return _Run(args)
@base.ReleaseTracks(base.ReleaseTrack.BETA)
class CreateBeta(Create):
"""Creates one or more Cloud Pub/Sub topics."""
@staticmethod
def Args(parser):
_Args(
parser,
)
def Run(self, args):
legacy_output = properties.VALUES.pubsub.legacy_output.GetBool()
return _Run(args, legacy_output=legacy_output, enable_vertex_ai_smt=False)
@base.ReleaseTracks(base.ReleaseTrack.ALPHA)
class CreateAlpha(CreateBeta):
"""Creates one or more Cloud Pub/Sub topics."""
@staticmethod
def Args(parser):
super(CreateAlpha, CreateAlpha).Args(parser)
def Run(self, args):
legacy_output = properties.VALUES.pubsub.legacy_output.GetBool()
return _Run(args, legacy_output=legacy_output, enable_vertex_ai_smt=True)

View File

@@ -0,0 +1,87 @@
# -*- coding: utf-8 -*- #
# Copyright 2015 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 Pub/Sub topics delete command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from apitools.base.py import exceptions as api_ex
from googlecloudsdk.api_lib.pubsub import topics
from googlecloudsdk.api_lib.util import exceptions
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.pubsub import resource_args
from googlecloudsdk.command_lib.pubsub import util
from googlecloudsdk.core import log
from googlecloudsdk.core import properties
def _Run(args, legacy_output=False):
"""Deletes one or more topics."""
client = topics.TopicsClient()
failed = []
for topic_ref in args.CONCEPTS.topic.Parse():
try:
result = client.Delete(topic_ref)
except api_ex.HttpError as error:
exc = exceptions.HttpException(error)
log.DeletedResource(
topic_ref.RelativeName(),
kind='topic',
failed=util.CreateFailureErrorMessage(exc.payload.status_message),
)
failed.append(topic_ref.topicsId)
continue
topic = client.messages.Topic(name=topic_ref.RelativeName())
if legacy_output:
result = util.TopicDisplayDict(topic)
log.DeletedResource(topic_ref.RelativeName(), kind='topic')
yield result
if failed:
raise util.RequestsFailedError(failed, 'delete')
@base.ReleaseTracks(base.ReleaseTrack.GA)
class Delete(base.DeleteCommand):
"""Deletes one or more Cloud Pub/Sub topics."""
detailed_help = {
'EXAMPLES':
"""\
To delete a Cloud Pub/Sub topic, run:
$ {command} mytopic"""
}
@staticmethod
def Args(parser):
resource_args.AddTopicResourceArg(parser, 'to delete.', plural=True)
def Run(self, args):
return _Run(args)
@base.ReleaseTracks(base.ReleaseTrack.BETA, base.ReleaseTrack.ALPHA)
class DeleteBeta(Delete):
"""Deletes one or more Cloud Pub/Sub topics."""
def Run(self, args):
legacy_output = properties.VALUES.pubsub.legacy_output.GetBool()
return _Run(args, legacy_output=legacy_output)

View File

@@ -0,0 +1,62 @@
# -*- coding: utf-8 -*- #
# Copyright 2017 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 Pub/Sub topic describe command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.api_lib.pubsub import topics
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.pubsub import resource_args
def _FormatRequiresDelimiterEscaping(output_format):
return (
output_format is None
or output_format.startswith('yaml')
or output_format.startswith('default')
)
@base.UniverseCompatible
class Describe(base.DescribeCommand):
"""Describes a Cloud Pub/Sub topic."""
@staticmethod
def Args(parser):
resource_args.AddTopicResourceArg(parser, 'to describe.')
def Run(self, args):
client = topics.TopicsClient()
topic_ref = args.CONCEPTS.topic.Parse()
topic_result = client.Get(topic_ref)
if (not _FormatRequiresDelimiterEscaping(args.format)):
return topic_result
# Ensure that the newline character is displayed correctly when used as the
# delimiter for ingestion from Cloud Storage.
ingestion_settings = topic_result.ingestionDataSourceSettings
if (
ingestion_settings
and ingestion_settings.cloudStorage
and ingestion_settings.cloudStorage.textFormat
and ingestion_settings.cloudStorage.textFormat.delimiter == '\n'
):
topic_result.ingestionDataSourceSettings.cloudStorage.textFormat.delimiter = (
'\\n'
)
return topic_result

View File

@@ -0,0 +1,76 @@
# -*- coding: utf-8 -*- #
# Copyright 2020 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 Pub/Sub topics detach-subscription command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from apitools.base.py import exceptions as api_ex
from googlecloudsdk.api_lib.pubsub import topics
from googlecloudsdk.api_lib.util import exceptions
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.pubsub import resource_args
from googlecloudsdk.command_lib.pubsub import util
from googlecloudsdk.core import log
def _Run(args):
"""Detaches one or more subscriptions."""
client = topics.TopicsClient()
failed = []
for subscription_ref in args.CONCEPTS.subscription.Parse():
try:
result = client.DetachSubscription(subscription_ref)
except api_ex.HttpError as error:
exc = exceptions.HttpException(error)
log.DetachedResource(
subscription_ref.RelativeName(),
kind='subscription',
failed=util.CreateFailureErrorMessage(exc.payload.status_message),
)
failed.append(subscription_ref.subscriptionsId)
continue
subscription = client.messages.Subscription(
name=subscription_ref.RelativeName())
log.DetachedResource(subscription_ref.RelativeName(), kind='subscription')
yield result
if failed:
raise util.RequestsFailedError(failed, 'detach')
@base.ReleaseTracks(base.ReleaseTrack.ALPHA, base.ReleaseTrack.BETA,
base.ReleaseTrack.GA)
class DetachSubscription(base.UpdateCommand):
"""Detaches one or more Cloud Pub/Sub subscriptions."""
detailed_help = {
'EXAMPLES':
"""\
To detach a Cloud Pub/Sub subscription, run:
$ {command} mysubscription"""
}
@staticmethod
def Args(parser):
resource_args.AddSubscriptionResourceArg(parser, 'to detach.', plural=True)
def Run(self, args):
return _Run(args)

View File

@@ -0,0 +1,50 @@
# -*- coding: utf-8 -*- #
# Copyright 2017 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 Pub/Sub topics get-iam-policy command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.api_lib.pubsub import topics
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.pubsub import resource_args
@base.ReleaseTracks(base.ReleaseTrack.GA, base.ReleaseTrack.BETA)
class GetIamPolicy(base.ListCommand):
"""Get the IAM policy for a Cloud Pub/Sub Topic."""
detailed_help = {
'DESCRIPTION':
'{description}',
'EXAMPLES':
"""\
To print the IAM policy for a given topic, run:
$ {command} my-topic
""",
}
@staticmethod
def Args(parser):
resource_args.AddTopicResourceArg(parser, 'to get the IAM policy of.')
base.URI_FLAG.RemoveFromParser(parser)
def Run(self, args):
client = topics.TopicsClient()
topic_ref = args.CONCEPTS.topic.Parse()
return client.GetIamPolicy(topic_ref)

View File

@@ -0,0 +1,23 @@
- release_tracks: [ALPHA]
help_text:
brief: Get the IAM policy for a topic.
description: |
*{command}* displays the IAM policy associated with a topic.
If formatted as JSON, the output can be edited and used as
a policy file for *set-iam-policy*. The output includes an "etag"
field identifying the version emitted and allowing detection of
concurrent policy updates; see
$ {parent} set-iam-policy for additional details.
examples: |
To print the IAM policy for a given topic, run:
$ {command} my-topic
request:
collection: pubsub.projects.topics
arguments:
resource:
help_text: The topic for which to display the IAM policy.
spec: !REF googlecloudsdk.command_lib.pubsub.resources:topic

View File

@@ -0,0 +1,75 @@
# -*- coding: utf-8 -*- #
# Copyright 2015 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 Pub/Sub topics list command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.api_lib.pubsub import topics
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.pubsub import util
from googlecloudsdk.core import properties
def _Run(args, legacy_output=False):
client = topics.TopicsClient()
for topic in client.List(util.ParseProject(), page_size=args.page_size):
if legacy_output:
topic = util.ListTopicDisplayDict(topic)
yield topic
@base.ReleaseTracks(base.ReleaseTrack.GA)
class List(base.ListCommand):
"""Lists Cloud Pub/Sub topics within a project."""
detailed_help = {
'DESCRIPTION':
"""\
Lists all of the Cloud Pub/Sub topics that exist in a given project that
match the given topic name filter.""",
'EXAMPLES':
"""\
To filter results by topic name (ie. only show topic 'my-topic'), run:
$ {command} --filter="name.scope(topic):'my-topic'"
To combine multiple filters (with AND or OR), run:
$ {command} --filter="name.scope(topic):'my-topic' OR name.scope(topic):'my-other-topic'"
To filter topics that match an expression:
$ {command} --filter="name.scope(topic):'my-topic_*'"
""",
}
@staticmethod
def Args(parser):
parser.display_info.AddFormat('yaml')
parser.display_info.AddUriFunc(util.TopicUriFunc)
def Run(self, args):
return _Run(args)
@base.ReleaseTracks(base.ReleaseTrack.BETA, base.ReleaseTrack.ALPHA)
class ListBeta(List):
"""Lists Cloud Pub/Sub topics within a project."""
def Run(self, args):
legacy_output = properties.VALUES.pubsub.legacy_output.GetBool()
return _Run(args, legacy_output=legacy_output)

View File

@@ -0,0 +1,63 @@
# -*- coding: utf-8 -*- #
# Copyright 2018 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 Pub/Sub topics list-snapshots command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.api_lib.pubsub import topics
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.pubsub import resource_args
from googlecloudsdk.command_lib.pubsub import util
@base.ReleaseTracks(base.ReleaseTrack.ALPHA)
class ListSnapshots(base.ListCommand):
"""Lists Cloud Pub/Sub snapshots from a given topic."""
detailed_help = {
'DESCRIPTION':
"""\
Lists all of the Cloud Pub/Sub snapshots attached to the given
topic and that match the given filter.""",
'EXAMPLES':
"""\
To filter results by snapshot name
(ie. only show snapshot 'mysnaps'), run:
$ {command} mytopic --filter=snapshotId:mysnaps
To combine multiple filters (with AND or OR), run:
$ {command} mytopic --filter="snapshotId:mysnaps1 AND snapshotId:mysnaps2"
To filter snapshots that match an expression:
$ {command} mytopic --filter="snapshotId:snaps_*"
""",
}
@staticmethod
def Args(parser):
parser.display_info.AddFormat('yaml')
parser.display_info.AddUriFunc(util.SnapshotUriFunc)
resource_args.AddTopicResourceArg(parser, 'to list snapshots for.')
def Run(self, args):
client = topics.TopicsClient()
topic_ref = args.CONCEPTS.topic.Parse()
return client.ListSnapshots(topic_ref, page_size=args.page_size)

View File

@@ -0,0 +1,78 @@
# -*- coding: utf-8 -*- #
# Copyright 2015 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 Pub/Sub topics list_subscriptions command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.api_lib.pubsub import topics
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.pubsub import resource_args
from googlecloudsdk.command_lib.pubsub import util
from googlecloudsdk.core import properties
def _Run(args, legacy_output=False):
client = topics.TopicsClient()
topic_ref = args.CONCEPTS.topic.Parse()
for topic_sub in client.ListSubscriptions(
topic_ref, page_size=args.page_size):
if legacy_output:
topic_sub = util.ListTopicSubscriptionDisplayDict(topic_sub)
yield topic_sub
@base.ReleaseTracks(base.ReleaseTrack.GA)
class ListSubscriptions(base.ListCommand):
"""Lists Cloud Pub/Sub subscriptions from a given topic."""
detailed_help = {
'DESCRIPTION':
"""\
Lists all of the Cloud Pub/Sub subscriptions attached to the given
topic and that match the given filter.""",
'EXAMPLES':
"""\
To filter results by subscription name
(ie. only show subscription 'mysubs'), run:
$ {command} mytopic --filter=mysubs
To combine multiple filters (with AND or OR), run:
$ {command} mytopic --filter="mysubs1 OR mysubs2"
""",
}
@staticmethod
def Args(parser):
parser.display_info.AddFormat('yaml')
parser.display_info.AddUriFunc(util.SubscriptionUriFunc)
resource_args.AddTopicResourceArg(parser, 'to list subscriptions for.')
def Run(self, args):
return _Run(args)
@base.ReleaseTracks(base.ReleaseTrack.BETA, base.ReleaseTrack.ALPHA)
class ListSubscriptionsBeta(ListSubscriptions):
"""Lists Cloud Pub/Sub subscriptions from a given topic."""
def Run(self, args):
legacy_output = properties.VALUES.pubsub.legacy_output.GetBool()
return _Run(args, legacy_output=legacy_output)

View File

@@ -0,0 +1,92 @@
# -*- coding: utf-8 -*- #
# Copyright 2015 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 Pub/Sub topics publish command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.api_lib.pubsub import topics
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.pubsub import flags
from googlecloudsdk.command_lib.pubsub import resource_args
from googlecloudsdk.command_lib.pubsub import util
from googlecloudsdk.core import properties
from googlecloudsdk.core.resource import resource_projector
from googlecloudsdk.core.util import http_encoding
def _Run(args, message_body, legacy_output=False):
"""Publishes a message to a topic."""
client = topics.TopicsClient()
attributes = util.ParseAttributes(args.attribute, messages=client.messages)
ordering_key = getattr(args, 'ordering_key', None)
topic_ref = args.CONCEPTS.topic.Parse()
result = client.Publish(topic_ref, http_encoding.Encode(message_body),
attributes, ordering_key)
if legacy_output:
# We only allow to publish one message at a time, so do not return a
# list of messageId.
result = resource_projector.MakeSerializable(result)
result['messageIds'] = result['messageIds'][0]
return result
@base.ReleaseTracks(base.ReleaseTrack.GA)
class Publish(base.Command):
"""Publishes a message to the specified topic."""
detailed_help = {
'DESCRIPTION':
"""\
Publishes a message to the specified topic name for testing and
troubleshooting. Use with caution: all associated subscribers must
be able to consume and acknowledge any message you publish,
otherwise the system will continuously re-attempt delivery of the
bad message for 7 days.""",
'EXAMPLES':
"""\
To publish messages in a batch to a specific Cloud Pub/Sub topic,
run:
$ {command} mytopic --message="Hello World!" --attribute=KEY1=VAL1,KEY2=VAL2
"""
}
@classmethod
def Args(cls, parser):
resource_args.AddTopicResourceArg(parser, 'to publish messages to.')
flags.AddPublishMessageFlags(parser)
def Run(self, args):
return _Run(args, args.message)
@base.ReleaseTracks(base.ReleaseTrack.BETA, base.ReleaseTrack.ALPHA)
class PublishBeta(Publish):
"""Publishes a message to the specified topic."""
@classmethod
def Args(cls, parser):
resource_args.AddTopicResourceArg(parser, 'to publish messages to.')
flags.AddPublishMessageFlags(parser, add_deprecated=True)
def Run(self, args):
message_body = flags.ParseMessageBody(args)
legacy_output = properties.VALUES.pubsub.legacy_output.GetBool()
return _Run(args, message_body, legacy_output=legacy_output)

View File

@@ -0,0 +1,58 @@
release_tracks: [ALPHA, BETA, GA]
help_text:
brief: Remove IAM policy binding of a topic
description: |
Remove an IAM policy binding of a Cloud Pub/Sub Topic.
examples: |
To Remove an IAM policy binding for the role of 'roles/editor' for the user 'test-user@gmail.com'
with topic 'my-topic', run:
$ {command} my-topic --member='user:test-user@gmail.com' --role='roles/editor'
The following command will remove an IAM policy binding for the role of
'roles/editor' from all authenticated users on topic
'my-topic':
$ {command} my-topic --member='allAuthenticatedUsers' --role='roles/editor'
See https://cloud.google.com/iam/docs/managing-policies for details of
policy role and member types.
request:
collection: pubsub.projects.topics
arguments:
resource:
help_text: The topic to remove the IAM policy binding from.
spec: !REF googlecloudsdk.command_lib.pubsub.resources:topic
ALPHA:
help_text:
brief: Remove IAM policy binding of a topic.
description: |
Remove an IAM policy binding from the IAM policy of a Cloud Pub/Sub Topic. One binding consists of a member,
a role, and an optional condition.
examples: |
To remove an IAM policy binding for the role of 'roles/editor' for the user 'test-user@gmail.com'
with topic 'my-topic', run:
$ {command} my-topic --member='user:test-user@gmail.com' --role='roles/editor'
The following command will remove an IAM policy binding for the role of
'roles/editor' from all authenticated users on topic
'my-topic':
$ {command} my-topic --member='allAuthenticatedUsers' --role='roles/editor'
To remove an IAM policy binding which expires at the end of the year 2018 for the role of
'roles/pubsub.publisher' and the user 'test-user@gmail.com' with topic 'my-topic', run:
$ {command} my-topic --member='user:test-user@gmail.com' --role='roles/pubsub.publisher' --condition='expression=request.time < timestamp("2019-01-01T00:00:00Z"),title=expires_end_of_2018,description=Expires at midnight on 2018-12-31'
See https://cloud.google.com/iam/docs/managing-policies for details of
policy role and member types.
iam:
enable_condition: true

View File

@@ -0,0 +1,50 @@
# -*- coding: utf-8 -*- #
# Copyright 2017 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 Pub/Sub topics set-iam-policy command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.api_lib.pubsub import topics
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.iam import iam_util
from googlecloudsdk.command_lib.pubsub import flags
from googlecloudsdk.command_lib.pubsub import resource_args
from googlecloudsdk.core import log
@base.ReleaseTracks(base.ReleaseTrack.GA, base.ReleaseTrack.BETA)
class SetIamPolicy(base.Command):
"""Set the IAM policy for a Cloud Pub/Sub Topic."""
detailed_help = iam_util.GetDetailedHelpForSetIamPolicy('topic', 'my-topic')
@staticmethod
def Args(parser):
resource_args.AddTopicResourceArg(parser, 'to set an IAM policy on.')
flags.AddIamPolicyFileFlag(parser)
def Run(self, args):
client = topics.TopicsClient()
messages = client.messages
topic_ref = args.CONCEPTS.topic.Parse()
policy = iam_util.ParsePolicyFile(args.policy_file, messages.Policy)
response = client.SetIamPolicy(topic_ref, policy=policy)
log.status.Print('Updated IAM policy for topic [{}].'.format(
topic_ref.Name()))
return response

View File

@@ -0,0 +1,27 @@
- release_tracks: [ALPHA]
help_text:
brief: Set the IAM policy for a Cloud Pub/Sub Topic.
description: |
This command replaces the existing IAM policy for a topic, given a topic
and a file encoded in JSON or YAML that contains the IAM policy. If the
given policy file specifies an "etag" value, then the replacement will
succeed only if the policy already in place matches that etag. (An etag
obtained via `get-iam-policy` will prevent the replacement if the policy
for the topic has been subsequently updated.) A policy file that does not
contain an etag value will replace any existing policy for the topic.
examples: |
The following command will read an IAM policy defined in a JSON file
'policy.json' and set it for a topic with identifier 'my-topic'
$ {command} my-topic policy.json
See https://cloud.google.com/iam/docs/managing-policies for details of the
policy file format and contents.
request:
collection: pubsub.projects.topics
arguments:
resource:
help_text: The topic for which to set the IAM policy.
spec: !REF googlecloudsdk.command_lib.pubsub.resources:topic

View File

@@ -0,0 +1,385 @@
# -*- coding: utf-8 -*- #
# Copyright 2017 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 Pub/Sub topics update command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.api_lib.pubsub import topics
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.kms import resource_args as kms_resource_args
from googlecloudsdk.command_lib.pubsub import flags
from googlecloudsdk.command_lib.pubsub import resource_args
from googlecloudsdk.command_lib.pubsub import util
from googlecloudsdk.command_lib.util.args import labels_util
from googlecloudsdk.core import exceptions as core_exceptions
from googlecloudsdk.core import log
DETAILED_HELP = {'EXAMPLES': """\
To update existing labels on a Cloud Pub/Sub topic, run:
$ {command} mytopic --update-labels=KEY1=VAL1,KEY2=VAL2
To clear all labels on a Cloud Pub/Sub topic, run:
$ {command} mytopic --clear-labels
To remove an existing label on a Cloud Pub/Sub topic, run:
$ {command} mytopic --remove-labels=KEY1,KEY2
To enable customer-managed encryption for a Cloud Pub/Sub topic by protecting message data with a Cloud KMS CryptoKey, run:
$ {command} mytopic --topic-encryption-key=projects/PROJECT_ID/locations/KMS_LOCATION/keyRings/KEYRING/cryptoKeys/KEY
To enable or update retention on a Cloud Pub/Sub topic, run:
$ {command} mytopic --message-retention-duration=MESSAGE_RETENTION_DURATION
To disable retention on a Cloud Pub/Sub topic, run:
$ {command} mytopic --clear-message-retention-duration
To update a Cloud Pub/Sub topic's message storage policy, run:
$ {command} mytopic --message-storage-policy-allowed-regions=some-cloud-region1,some-cloud-region2
To recompute a Cloud Pub/Sub topic's message storage policy based on your organization's "Resource Location Restriction" policy, run:
$ {command} mytopic --recompute-message-storage-policy
To enforce both at-rest and in-transit guarantees for messages published to the topic, run:
$ {command} mytopic --message-storage-policy-allowed-regions=some-cloud-region1,some-cloud-region2 --message-storage-policy-enforce-in-transit
"""}
_KMS_FLAG_OVERRIDES = {
'kms-key': '--topic-encryption-key',
'kms-keyring': '--topic-encryption-key-keyring',
'kms-location': '--topic-encryption-key-location',
'kms-project': '--topic-encryption-key-project',
}
_KMS_PERMISSION_INFO = """
The specified Cloud KMS key should have purpose set to "ENCRYPT_DECRYPT".
The service account,
"service-${CONSUMER_PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com"
requires the IAM cryptoKeyEncrypterDecrypter role for the given Cloud KMS key.
CONSUMER_PROJECT_NUMBER is the project number of the project that is the parent
of the topic being updated"""
def _GetKmsKeyNameFromArgs(args):
"""Parses the KMS key resource name from args.
Args:
args: an argparse namespace. All the arguments that were provided to this
command invocation.
Returns:
The KMS CryptoKey resource name for the key specified in args, or None.
"""
kms_ref = args.CONCEPTS.kms_key.Parse()
if kms_ref:
return kms_ref.RelativeName()
# Check whether the user specified any topic-encryption-key flags.
for keyword in [
'topic-encryption-key',
'topic-encryption-key-project',
'topic-encryption-key-location',
'topic-encryption-key-keyring',
]:
if args.IsSpecified(keyword.replace('-', '_')):
raise core_exceptions.Error(
'--topic-encryption-key was not fully specified.'
)
return None
def _Args(
parser,
):
"""Registers flags for this command."""
resource_args.AddTopicResourceArg(parser, 'to update.')
labels_util.AddUpdateLabelsFlags(parser)
resource_args.AddResourceArgs(
parser,
[
kms_resource_args.GetKmsKeyPresentationSpec(
'topic',
flag_overrides=_KMS_FLAG_OVERRIDES,
permission_info=_KMS_PERMISSION_INFO,
)
],
)
flags.AddTopicMessageRetentionFlags(parser, is_update=True)
flags.AddTopicMessageStoragePolicyFlags(parser, is_update=True)
flags.AddSchemaSettingsFlags(parser, is_update=True)
flags.AddIngestionDatasourceFlags(
parser,
is_update=True,
)
flags.AddMessageTransformsFlags(parser, is_update=True)
def _Run(args, /, *, enable_vertex_ai_smt=False):
"""This is what gets called when the user runs this command.
Args:
args: an argparse namespace. All the arguments that were provided to this
command invocation.
enable_vertex_ai_smt: Whether to enable Vertex AI SMTs.
Returns:
A serialized object (dict) describing the results of the operation.
Raises:
An HttpException if there was a problem calling the
API topics.Patch command.
"""
client = topics.TopicsClient()
topic_ref = args.CONCEPTS.topic.Parse()
message_retention_duration = getattr(args, 'message_retention_duration', None)
if message_retention_duration:
message_retention_duration = util.FormatDuration(message_retention_duration)
clear_message_retention_duration = getattr(
args, 'clear_message_retention_duration', None
)
labels_update = labels_util.ProcessUpdateArgsLazy(
args,
client.messages.Topic.LabelsValue,
orig_labels_thunk=lambda: client.Get(topic_ref).labels,
)
schema = getattr(args, 'schema', None)
if schema:
schema = args.CONCEPTS.schema.Parse().RelativeName()
message_encoding_list = getattr(args, 'message_encoding', None)
message_encoding = None
if message_encoding_list:
message_encoding = message_encoding_list[0]
first_revision_id = getattr(args, 'first_revision_id', None)
last_revision_id = getattr(args, 'last_revision_id', None)
result = None
clear_schema_settings = getattr(args, 'clear_schema_settings', None)
message_storage_policy_enforce_in_transit = getattr(
args, 'message_storage_policy_enforce_in_transit', None
)
kinesis_ingestion_stream_arn = getattr(
args, 'kinesis_ingestion_stream_arn', None
)
kinesis_ingestion_consumer_arn = getattr(
args, 'kinesis_ingestion_consumer_arn', None
)
kinesis_ingestion_role_arn = getattr(args, 'kinesis_ingestion_role_arn', None)
kinesis_ingestion_service_account = getattr(
args, 'kinesis_ingestion_service_account', None
)
cloud_storage_ingestion_bucket = getattr(
args, 'cloud_storage_ingestion_bucket', None
)
cloud_storage_ingestion_input_format_list = getattr(
args, 'cloud_storage_ingestion_input_format', None
)
cloud_storage_ingestion_input_format = None
if cloud_storage_ingestion_input_format_list:
cloud_storage_ingestion_input_format = (
cloud_storage_ingestion_input_format_list[0]
)
cloud_storage_ingestion_text_delimiter = getattr(
args, 'cloud_storage_ingestion_text_delimiter', None
)
if cloud_storage_ingestion_text_delimiter:
# Interprets special characters representations (i.e., "\n") as their
# expected characters (i.e., newline).
cloud_storage_ingestion_text_delimiter = (
cloud_storage_ingestion_text_delimiter.encode('utf-8').decode(
'unicode-escape'
)
)
cloud_storage_ingestion_minimum_object_create_time = getattr(
args, 'cloud_storage_ingestion_minimum_object_create_time', None
)
cloud_storage_ingestion_match_glob = getattr(
args, 'cloud_storage_ingestion_match_glob', None
)
azure_event_hubs_ingestion_resource_group = getattr(
args, 'azure_event_hubs_ingestion_resource_group', None
)
azure_event_hubs_ingestion_namespace = getattr(
args, 'azure_event_hubs_ingestion_namespace', None
)
azure_event_hubs_ingestion_event_hub = getattr(
args, 'azure_event_hubs_ingestion_event_hub', None
)
azure_event_hubs_ingestion_client_id = getattr(
args, 'azure_event_hubs_ingestion_client_id', None
)
azure_event_hubs_ingestion_tenant_id = getattr(
args, 'azure_event_hubs_ingestion_tenant_id', None
)
azure_event_hubs_ingestion_subscription_id = getattr(
args, 'azure_event_hubs_ingestion_subscription_id', None
)
azure_event_hubs_ingestion_service_account = getattr(
args, 'azure_event_hubs_ingestion_service_account', None
)
aws_msk_ingestion_cluster_arn = getattr(
args, 'aws_msk_ingestion_cluster_arn', None
)
aws_msk_ingestion_topic = getattr(args, 'aws_msk_ingestion_topic', None)
aws_msk_ingestion_aws_role_arn = getattr(
args, 'aws_msk_ingestion_aws_role_arn', None
)
aws_msk_ingestion_service_account = getattr(
args, 'aws_msk_ingestion_service_account', None
)
confluent_cloud_ingestion_bootstrap_server = getattr(
args, 'confluent_cloud_ingestion_bootstrap_server', None
)
confluent_cloud_ingestion_cluster_id = getattr(
args, 'confluent_cloud_ingestion_cluster_id', None
)
confluent_cloud_ingestion_topic = getattr(
args, 'confluent_cloud_ingestion_topic', None
)
confluent_cloud_ingestion_identity_pool_id = getattr(
args, 'confluent_cloud_ingestion_identity_pool_id', None
)
confluent_cloud_ingestion_service_account = getattr(
args, 'confluent_cloud_ingestion_service_account', None
)
ingestion_log_severity = getattr(args, 'ingestion_log_severity', None)
clear_ingestion_data_source_settings = getattr(
args, 'clear_ingestion_data_source_settings', None
)
message_transforms_file = getattr(args, 'message_transforms_file', None)
clear_message_transforms = getattr(args, 'clear_message_transforms', None)
try:
result = client.Patch(
topic_ref,
labels_update.GetOrNone(),
_GetKmsKeyNameFromArgs(args),
message_retention_duration,
clear_message_retention_duration,
args.recompute_message_storage_policy,
args.message_storage_policy_allowed_regions,
message_storage_policy_enforce_in_transit,
schema=schema,
message_encoding=message_encoding,
first_revision_id=first_revision_id,
last_revision_id=last_revision_id,
clear_schema_settings=clear_schema_settings,
kinesis_ingestion_stream_arn=kinesis_ingestion_stream_arn,
kinesis_ingestion_consumer_arn=kinesis_ingestion_consumer_arn,
kinesis_ingestion_role_arn=kinesis_ingestion_role_arn,
kinesis_ingestion_service_account=kinesis_ingestion_service_account,
cloud_storage_ingestion_bucket=cloud_storage_ingestion_bucket,
cloud_storage_ingestion_input_format=cloud_storage_ingestion_input_format,
cloud_storage_ingestion_text_delimiter=cloud_storage_ingestion_text_delimiter,
cloud_storage_ingestion_minimum_object_create_time=cloud_storage_ingestion_minimum_object_create_time,
cloud_storage_ingestion_match_glob=cloud_storage_ingestion_match_glob,
azure_event_hubs_ingestion_resource_group=azure_event_hubs_ingestion_resource_group,
azure_event_hubs_ingestion_namespace=azure_event_hubs_ingestion_namespace,
azure_event_hubs_ingestion_event_hub=azure_event_hubs_ingestion_event_hub,
azure_event_hubs_ingestion_client_id=azure_event_hubs_ingestion_client_id,
azure_event_hubs_ingestion_tenant_id=azure_event_hubs_ingestion_tenant_id,
azure_event_hubs_ingestion_subscription_id=azure_event_hubs_ingestion_subscription_id,
azure_event_hubs_ingestion_service_account=azure_event_hubs_ingestion_service_account,
aws_msk_ingestion_cluster_arn=aws_msk_ingestion_cluster_arn,
aws_msk_ingestion_topic=aws_msk_ingestion_topic,
aws_msk_ingestion_aws_role_arn=aws_msk_ingestion_aws_role_arn,
aws_msk_ingestion_service_account=aws_msk_ingestion_service_account,
confluent_cloud_ingestion_bootstrap_server=confluent_cloud_ingestion_bootstrap_server,
confluent_cloud_ingestion_cluster_id=confluent_cloud_ingestion_cluster_id,
confluent_cloud_ingestion_topic=confluent_cloud_ingestion_topic,
confluent_cloud_ingestion_identity_pool_id=confluent_cloud_ingestion_identity_pool_id,
confluent_cloud_ingestion_service_account=confluent_cloud_ingestion_service_account,
clear_ingestion_data_source_settings=clear_ingestion_data_source_settings,
ingestion_log_severity=ingestion_log_severity,
message_transforms_file=message_transforms_file,
clear_message_transforms=clear_message_transforms,
enable_vertex_ai_smt=enable_vertex_ai_smt,
)
except topics.NoFieldsSpecifiedError:
operations = [
'clear_labels',
'update_labels',
'remove_labels',
'recompute_message_storage_policy',
'message_storage_policy_allowed_regions',
]
if not any(args.IsSpecified(arg) for arg in operations):
raise
log.status.Print('No update to perform.')
else:
log.UpdatedResource(topic_ref.RelativeName(), kind='topic')
return result
@base.UniverseCompatible
@base.ReleaseTracks(base.ReleaseTrack.GA)
class Update(base.UpdateCommand):
"""Updates an existing Cloud Pub/Sub topic."""
detailed_help = DETAILED_HELP
@staticmethod
def Args(parser):
"""Registers flags for this command."""
_Args(
parser,
)
def Run(self, args):
return _Run(args)
@base.ReleaseTracks(base.ReleaseTrack.BETA)
class UpdateBeta(Update):
"""Updates an existing Cloud Pub/Sub topic."""
@staticmethod
def Args(parser):
_Args(
parser,
)
def Run(self, args):
return _Run(args)
@base.ReleaseTracks(base.ReleaseTrack.ALPHA)
class UpdateAlpha(UpdateBeta):
"""Updates an existing Cloud Pub/Sub topic."""
@staticmethod
def Args(parser):
_Args(
parser,
)
def Run(self, args):
return _Run(args, enable_vertex_ai_smt=True)