File: //lib/google-cloud-sdk/lib/googlecloudsdk/command_lib/iot/resource_args.py
# -*- 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 IoT 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 DeviceAttributeConfig(name='device'):
return concepts.ResourceParameterAttributeConfig(
name=name,
help_text='The device of the {resource}.',
completion_request_params={'fieldMask': 'name'},
completion_id_field='id')
def RegistryAttributeConfig():
return concepts.ResourceParameterAttributeConfig(
name='registry',
help_text='The device registry for the {resource}.')
def RegionAttributeConfig():
return concepts.ResourceParameterAttributeConfig(
name='region',
help_text='The Cloud region for the {resource}.')
def GetDeviceResourceSpec(resource_name='device'):
return concepts.ResourceSpec(
'cloudiot.projects.locations.registries.devices',
resource_name=resource_name,
devicesId=DeviceAttributeConfig(name=resource_name),
registriesId=RegistryAttributeConfig(),
locationsId=RegionAttributeConfig(),
projectsId=concepts.DEFAULT_PROJECT_ATTRIBUTE_CONFIG,
disable_auto_completers=False)
def GetRegistryResourceSpec():
return concepts.ResourceSpec(
'cloudiot.projects.locations.registries',
resource_name='registry',
registriesId=RegistryAttributeConfig(),
locationsId=RegionAttributeConfig(),
projectsId=concepts.DEFAULT_PROJECT_ATTRIBUTE_CONFIG,
disable_auto_completers=False)
def GetRegionResourceSpec():
return concepts.ResourceSpec(
'cloudiot.projects.locations',
resource_name='region',
locationsId=RegionAttributeConfig(),
projectsId=concepts.DEFAULT_PROJECT_ATTRIBUTE_CONFIG)
def AddDeviceResourceArg(parser, verb, positional=True):
"""Add a resource argument for a cloud IOT device.
NOTE: Must be used only if it's the only resource arg in the command.
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 device ID is a positional rather
than a flag.
"""
if positional:
name = 'device'
else:
name = '--device'
concept_parsers.ConceptParser.ForResource(
name,
GetDeviceResourceSpec(),
'The device {}.'.format(verb),
required=True).AddToParser(parser)
def AddRegistryResourceArg(parser, verb, positional=True):
"""Add a resource argument for a cloud IOT device registry.
NOTE: Must be used only if it's the only resource arg in the command.
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 device ID is a positional rather
than a flag.
"""
if positional:
name = 'registry'
else:
name = '--registry'
concept_parsers.ConceptParser.ForResource(
name,
GetRegistryResourceSpec(),
'The device registry {}.'.format(verb),
required=True).AddToParser(parser)
def AddRegionResourceArg(parser, verb):
"""Add a resource argument for a cloud IOT region.
NOTE: Must be used only if it's the only resource arg in the command.
Args:
parser: the parser for the command.
verb: str, the verb to describe the resource, such as 'to update'.
"""
concept_parsers.ConceptParser.ForResource(
'--region',
GetRegionResourceSpec(),
'The Cloud region {}.'.format(verb),
required=True).AddToParser(parser)
def CreateDevicePresentationSpec(verb, help_text='The device {}.',
name='device', required=False,
prefixes=True, positional=False):
"""Build ResourcePresentationSpec for generic device Resource.
NOTE: Should be used when there are multiple resources args in the command.
Args:
verb: string, the verb to describe the resource, such as 'to bind'.
help_text: string, the help text for the entire resource arg group. Should
have a format specifier (`{}`) to insert verb.
name: string, name of resource anchor argument.
required: bool, whether or not this resource arg is required.
prefixes: bool, if True the resource name will be used as a prefix for
the flags in the resource group.
positional: bool, if True, means that the device ID is a positional rather
than a flag.
Returns:
ResourcePresentationSpec, presentation spec for device.
"""
arg_name = name if positional else '--' + name
arg_help = help_text.format(verb)
return presentation_specs.ResourcePresentationSpec(
arg_name,
GetDeviceResourceSpec(name),
arg_help,
required=required,
prefixes=prefixes
)
def _GetBindResourceConcepts(verb='to bind to'):
"""Build ConceptParser for (un)bind commands resource args."""
arg_specs = [
CreateDevicePresentationSpec( # gateway spec
verb,
help_text='The gateway device {}.',
name='gateway',
required=True),
CreateDevicePresentationSpec( # device spec
verb,
help_text='The device {} the gateway.',
required=True),
]
fallthroughs = {
'--device.registry': ['--gateway.registry'],
'--gateway.registry': ['--device.registry']
}
return concept_parsers.ConceptParser(arg_specs, fallthroughs)
def AddBindResourceArgsToParser(parser):
"""Add resource args for gateways (un)bind commands to parser."""
_GetBindResourceConcepts().AddToParser(parser)
def BindAdditionalArgsHook():
return [_GetBindResourceConcepts()]
def UnBindAdditionalArgsHook():
return [_GetBindResourceConcepts('to unbind from')]