# -*- 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. """Shared resource flags for Cloud Pub/Sub commands.""" from __future__ import absolute_import from __future__ import division from __future__ import unicode_literals from googlecloudsdk.calliope.concepts import concepts from googlecloudsdk.command_lib.util.concepts import concept_parsers from googlecloudsdk.command_lib.util.concepts import presentation_specs def SubscriptionAttributeConfig(): return concepts.ResourceParameterAttributeConfig( name='subscription', help_text='Name of the subscription.') def TopicAttributeConfig(): return concepts.ResourceParameterAttributeConfig( name='topic', help_text='Name of the topic.') def SchemaAttributeConfig(): return concepts.ResourceParameterAttributeConfig( name='schema', help_text='Name of the schema.') def GetSubscriptionResourceSpec(): return concepts.ResourceSpec( 'pubsub.projects.subscriptions', resource_name='subscription', subscriptionsId=SubscriptionAttributeConfig(), projectsId=concepts.DEFAULT_PROJECT_ATTRIBUTE_CONFIG) def GetTopicResourceSpec(name='topic'): return concepts.ResourceSpec( 'pubsub.projects.topics', resource_name=name, topicsId=TopicAttributeConfig(), projectsId=concepts.DEFAULT_PROJECT_ATTRIBUTE_CONFIG) def GetSchemaResourceSpec(name='schema'): return concepts.ResourceSpec( 'pubsub.projects.schemas', resource_name=name, schemasId=SchemaAttributeConfig(), projectsId=concepts.DEFAULT_PROJECT_ATTRIBUTE_CONFIG) def CreateSubscriptionResourceArg( verb, plural=False, required=True, positional=True ): """Create a resource argument for a Cloud Pub/Sub Subscription. Args: verb: str, the verb to describe the resource, such as 'to update'. plural: bool, if True, use a resource argument that returns a list. required: bool, if True, create subscription resource arg will be required. positional: bool, if True, means that the subscription ID is a positional rather than a flag. Returns: the PresentationSpec for the resource argument. """ if positional: name = 'subscription' else: name = '--subscription' if plural: help_stem = 'One or more subscriptions' else: help_stem = 'Name of the subscription' return presentation_specs.ResourcePresentationSpec( name, GetSubscriptionResourceSpec(), '{} {}'.format(help_stem, verb), required=required, plural=plural, prefixes=True, ) def AddSubscriptionResourceArg(parser, verb, plural=False): """Add a resource argument for a Cloud Pub/Sub Subscription. Args: parser: the parser for the command. verb: str, the verb to describe the resource, such as 'to update'. plural: bool, if True, use a resource argument that returns a list. """ concept_parsers.ConceptParser( [CreateSubscriptionResourceArg(verb, plural=plural)] ).AddToParser(parser) def AddSchemaResourceArg(parser, verb, plural=False): """Add a resource argument for a Cloud Pub/Sub Schema. Args: parser: the parser for the command. verb: str, the verb to describe the resource, such as 'to update'. plural: bool, if True, use a resource argument that returns a list. """ concept_parsers.ConceptParser([CreateSchemaResourceArg(verb, plural=plural) ]).AddToParser(parser) def CreateTopicResourceArg(verb, positional=True, plural=False, required=True, flag_name='topic'): """Create a resource argument for a Cloud Pub/Sub Topic. Args: verb: str, the verb to describe the resource, such as 'to update'. positional: bool, if True, means that the topic ID is a positional rather than a flag. If not positional, this also creates a '--topic-project' flag as subscriptions and topics do not need to be in the same project. plural: bool, if True, use a resource argument that returns a list. required: bool, if True, create topic resource arg will be required. flag_name: str, name of the topic resource arg (singular). Returns: the PresentationSpec for the resource argument. """ if positional: name = flag_name flag_name_overrides = {} else: name = '--' + flag_name if not plural else '--' + flag_name + 's' flag_name_overrides = {'project': '--' + flag_name + '-project'} help_stem = 'Name of the topic' if plural: help_stem = 'One or more topics' return presentation_specs.ResourcePresentationSpec( name, GetTopicResourceSpec(flag_name), '{} {}'.format(help_stem, verb), required=required, flag_name_overrides=flag_name_overrides, plural=plural, prefixes=True) def AddTopicResourceArg(parser, verb, positional=True, plural=False): """Add a resource argument for a Cloud Pub/Sub Topic. Args: parser: the parser for the command. verb: str, the verb to describe the resource, such as 'to update'. positional: bool, if True, means that the topic ID is a positional rather than a flag. If not positional, this also creates a '--topic-project' flag as subscriptions and topics do not need to be in the same project. plural: bool, if True, use a resource argument that returns a list. """ concept_parsers.ConceptParser( [CreateTopicResourceArg(verb, positional=positional, plural=plural)] ).AddToParser(parser) def CreateSchemaResourceArg(verb, positional=True, plural=False, required=True, flag_name='schema'): """Create a resource argument for a Cloud Pub/Sub Schema. Args: verb: str, the verb to describe the resource, such as 'to update'. positional: bool, if True, means that the schema ID is a positional rather than a flag. If not positional, this also creates a '--schema-project' flag as schemas and topics do not need to be in the same project. plural: bool, if True, use a resource argument that returns a list. required: bool, if True, schema resource arg will be required. flag_name: str, name of the schema resource arg (singular). Returns: the PresentationSpec for the resource argument. """ if positional: name = flag_name flag_name_overrides = {} else: name = '--' + flag_name if not plural else '--' + flag_name + 's' flag_name_overrides = {'project': '--' + flag_name + '-project'} help_stem = 'Name of the schema' if plural: help_stem = 'One or more schemas' return presentation_specs.ResourcePresentationSpec( name, GetSchemaResourceSpec(flag_name), '{} {}'.format(help_stem, verb), required=required, flag_name_overrides=flag_name_overrides, plural=plural, prefixes=True) def AddResourceArgs(parser, resources): """Add resource arguments for commands that have topic and subscriptions. Args: parser: the parser for the command. resources: a list of resource args to add. """ concept_parsers.ConceptParser(resources).AddToParser(parser)