File: //proc/thread-self/root/snap/google-cloud-cli/396/lib/googlecloudsdk/command_lib/apphub/flags.py
# -*- 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.
"""Apphub Command Lib Flags."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.calliope import arg_parsers
from googlecloudsdk.calliope import base
from googlecloudsdk.calliope.concepts import concepts
from googlecloudsdk.calliope.concepts import deps
from googlecloudsdk.command_lib.apphub import utils as apphub_utils
from googlecloudsdk.command_lib.util.concepts import concept_parsers
from googlecloudsdk.command_lib.util.concepts import presentation_specs
def _DefaultToGlobalLocationAttributeConfig(help_text=None):
  """Create basic attributes that fallthrough location to global in resource argument.
  Args:
    help_text: If set, overrides default help text
  Returns:
    Resource argument parameter config
  """
  return concepts.ResourceParameterAttributeConfig(
      name='location',
      fallthroughs=[
          deps.Fallthrough(
              function=apphub_utils.DefaultToGlobal,
              hint='Service project attachments only support global location',
          )
      ],
      help_text=help_text if help_text else ('Location of the {resource}.'),
  )
def GetGlobalLocationResourceSpec():
  return concepts.ResourceSpec(
      'apphub.projects.locations',
      resource_name='location',
      locationsId=_DefaultToGlobalLocationAttributeConfig(),
      projectsId=concepts.DEFAULT_PROJECT_ATTRIBUTE_CONFIG,
  )
def GetGlobalLocationResourceArg(
    arg_name='location',
    help_text=None,
    positional=False,
    required=False,
):
  """Constructs and returns the Location Resource Argument."""
  help_text = help_text or 'Location.'
  return concept_parsers.ConceptParser.ForResource(
      '{}{}'.format('' if positional else '--', arg_name),
      GetGlobalLocationResourceSpec(),
      help_text,
      required=required,
  )
def LocationAttributeConfig():
  return concepts.ResourceParameterAttributeConfig(
      name='location',
      help_text='The Cloud location for the {resource}.',
  )
def GetLocationResourceSpec():
  return concepts.ResourceSpec(
      'apphub.projects.locations',
      resource_name='location',
      locationsId=LocationAttributeConfig(),
      projectsId=concepts.DEFAULT_PROJECT_ATTRIBUTE_CONFIG,
  )
def GetLocationResourceArg(
    arg_name='location',
    help_text=None,
    positional=False,
    required=True,
):
  """Constructs and returns the Location Resource Argument."""
  help_text = help_text or 'Location.'
  return concept_parsers.ConceptParser.ForResource(
      '{}{}'.format('' if positional else '--', arg_name),
      GetLocationResourceSpec(),
      help_text,
      required=required,
  )
def GetServiceProjectResourceSpec(arg_name='service_project', help_text=None):
  """Constructs and returns the Resource specification for Service project."""
  def ServiceProjectAttributeConfig():
    return concepts.ResourceParameterAttributeConfig(
        name=arg_name,
        help_text=help_text,
    )
  return concepts.ResourceSpec(
      'apphub.projects.locations.serviceProjectAttachments',
      resource_name='ServiceProjectAttachment',
      serviceProjectAttachmentsId=ServiceProjectAttributeConfig(),
      projectsId=concepts.DEFAULT_PROJECT_ATTRIBUTE_CONFIG,
      locationsId=_DefaultToGlobalLocationAttributeConfig(),
  )
def GetServiceProjectResourceArg(
    arg_name='service_project', help_text=None, positional=True, required=True
):
  """Constructs and returns the Service Project Resource Argument."""
  help_text = help_text or 'The Service Project ID.'
  return concept_parsers.ConceptParser.ForResource(
      '{}{}'.format('' if positional else '--', arg_name),
      GetServiceProjectResourceSpec(),
      help_text,
      required=required,
  )
def ApplicationResourceAttributeConfig(arg_name, help_text):
  """Helper function for constructing ResourceAttributeConfig."""
  return concepts.ResourceParameterAttributeConfig(
      name=arg_name,
      help_text=help_text,
  )
def GetApplicationResourceSpec(arg_name='application', help_text=None):
  """Constructs and returns the Resource specification for Application."""
  return concepts.ResourceSpec(
      'apphub.projects.locations.applications',
      resource_name='application',
      applicationsId=ApplicationResourceAttributeConfig(arg_name, help_text),
      projectsId=concepts.DEFAULT_PROJECT_ATTRIBUTE_CONFIG,
      locationsId=LocationAttributeConfig(),
  )
def GetApplicationResourceArg(
    arg_name='application', help_text=None, positional=True, required=True
):
  """Constructs and returns the Application ID Resource Argument."""
  help_text = help_text or 'The Application ID.'
  return concept_parsers.ConceptParser.ForResource(
      '{}{}'.format('' if positional else '--', arg_name),
      GetApplicationResourceSpec(),
      help_text,
      required=required,
  )
def AddDescribeServiceProjectFlags(parser):
  GetServiceProjectResourceArg().AddToParser(parser)
def AddDescribeApplicationFlags(parser):
  GetApplicationResourceArg().AddToParser(parser)
def AddListServiceProjectFlags(parser):
  GetGlobalLocationResourceArg().AddToParser(parser)
def AddListApplicationFlags(parser):
  GetLocationResourceArg().AddToParser(parser)
def AddServiceProjectFlags(parser):
  GetServiceProjectResourceArg().AddToParser(parser)
  parser.add_argument(
      '--async',
      dest='async_',
      action='store_true',
      default=False,
      help=(
          'Return immediately, without waiting for the operation in progress to'
          ' complete.'
      ),
  )
def CreateApplicationFlags(parser, release_track=base.ReleaseTrack.ALPHA):
  """Adds flags required to create an application."""
  GetApplicationResourceArg().AddToParser(parser)
  AddAttributesFlags(
      parser, resource_name='application', release_track=release_track
  )
  parser.add_argument(
      '--scope-type',
      choices={
          'REGIONAL': 'Represents a regional application',
          'GLOBAL': 'Represents a global application',
      },
      help='Scope of the Application',
      required=True,
  )
  parser.add_argument('--display-name', help='Human-friendly display name')
  parser.add_argument('--description', help='Description of the Application')
  parser.add_argument(
      '--async',
      dest='async_',
      action='store_true',
      default=False,
      help=(
          'Return immediately, without waiting for the operation in progress to'
          ' complete.'
      ),
  )
def UpdateApplicationFlags(parser, release_track=base.ReleaseTrack.ALPHA):
  """Adds flags required to create an application."""
  GetApplicationResourceArg().AddToParser(parser)
  parser.add_argument('--display-name', help='Human-friendly display name')
  parser.add_argument('--description', help='Description of the Application')
  AddAttributesFlags(
      parser, resource_name='application', release_track=release_track
  )
  parser.add_argument(
      '--async',
      dest='async_',
      action='store_true',
      default=False,
      help=(
          'Return immediately, without waiting for the operation in progress to'
          ' complete.'
      ),
  )
def AddRemoveServiceProjectFlags(parser):
  GetServiceProjectResourceArg().AddToParser(parser)
  parser.add_argument(
      '--async',
      dest='async_',
      action='store_true',
      default=False,
      help=(
          'Return immediately, without waiting for the operation in progress to'
          ' complete.'
      ),
  )
def GetDiscoveredServiceResourceSpec(
    arg_name='discovered_service', help_text=None
):
  """Constructs and returns the Resource specification for Discovered Service."""
  def DiscoveredServiceAttributeConfig():
    return concepts.ResourceParameterAttributeConfig(
        name=arg_name,
        help_text=help_text,
    )
  return concepts.ResourceSpec(
      'apphub.projects.locations.discoveredServices',
      resource_name='discoveredService',
      discoveredServicesId=DiscoveredServiceAttributeConfig(),
      projectsId=concepts.DEFAULT_PROJECT_ATTRIBUTE_CONFIG,
      locationsId=LocationAttributeConfig(),
  )
def GetDiscoveredServiceResourceArg(
    arg_name='discovered_service',
    help_text=None,
    positional=True,
    required=True,
):
  """Constructs and returns the Discovered Service Resource Argument."""
  help_text = help_text or 'The Discovered Service ID.'
  return concept_parsers.ConceptParser.ForResource(
      '{}{}'.format('' if positional else '--', arg_name),
      GetDiscoveredServiceResourceSpec(),
      help_text,
      required=required,
  )
def GetDiscoveredWorkloadResourceSpec(
    arg_name='discovered_workload', help_text=None
):
  """Constructs and returns the Resource specification for Discovered Workload."""
  def DiscoveredWorkloadAttributeConfig():
    return concepts.ResourceParameterAttributeConfig(
        name=arg_name,
        help_text=help_text,
    )
  return concepts.ResourceSpec(
      'apphub.projects.locations.discoveredWorkloads',
      resource_name='discoveredWorkload',
      discoveredWorkloadsId=DiscoveredWorkloadAttributeConfig(),
      projectsId=concepts.DEFAULT_PROJECT_ATTRIBUTE_CONFIG,
      locationsId=LocationAttributeConfig(),
  )
def GetDiscoveredWorkloadResourceArg(
    arg_name='discovered_workload',
    help_text=None,
    positional=True,
    required=True,
):
  """Constructs and returns the Discovered Workload Resource Argument."""
  help_text = help_text or 'The Discovered Workload ID.'
  return concept_parsers.ConceptParser.ForResource(
      '{}{}'.format('' if positional else '--', arg_name),
      GetDiscoveredWorkloadResourceSpec(),
      help_text,
      required=required,
  )
def GetApplicationWorkloadResourceSpec(
    arg_name='workload', help_text='Name for the workload'
):
  """Constructs and returns the Resource specification for Application Workload."""
  def ApplicationWorkloadAttributeConfig():
    return concepts.ResourceParameterAttributeConfig(
        name=arg_name,
        help_text=help_text,
    )
  return concepts.ResourceSpec(
      'apphub.projects.locations.applications.workloads',
      resource_name='workload',
      workloadsId=ApplicationWorkloadAttributeConfig(),
      projectsId=concepts.DEFAULT_PROJECT_ATTRIBUTE_CONFIG,
      locationsId=LocationAttributeConfig(),
      applicationsId=ApplicationResourceAttributeConfig(
          arg_name='application',
          help_text='Name for the application',
      ),
  )
def GetApplicationWorkloadResourceArg(
    arg_name='workload',
    help_text=None,
    positional=True,
    required=True,
):
  """Constructs and returns the application workload Resource Argument."""
  help_text = help_text or 'The Workload ID.'
  return concept_parsers.ConceptParser.ForResource(
      '{}{}'.format('' if positional else '--', arg_name),
      GetApplicationWorkloadResourceSpec(),
      help_text,
      required=required,
  )
def GetApplicationServiceResourceSpec(
    arg_name='service', help_text='Name for the service'
):
  """Constructs and returns the Resource specification for Application Service."""
  def ApplicationServiceAttributeConfig():
    return concepts.ResourceParameterAttributeConfig(
        name=arg_name,
        help_text=help_text,
    )
  return concepts.ResourceSpec(
      'apphub.projects.locations.applications.services',
      resource_name='service',
      servicesId=ApplicationServiceAttributeConfig(),
      projectsId=concepts.DEFAULT_PROJECT_ATTRIBUTE_CONFIG,
      locationsId=LocationAttributeConfig(),
      applicationsId=ApplicationResourceAttributeConfig(
          arg_name='application',
          help_text='Name for the application',
      ),
  )
def GetApplicationServiceResourceArg(
    arg_name='service',
    help_text=None,
    positional=True,
    required=True,
):
  """Constructs and returns the application service Resource Argument."""
  help_text = help_text or 'The Service ID.'
  return concept_parsers.ConceptParser.ForResource(
      '{}{}'.format('' if positional else '--', arg_name),
      GetApplicationServiceResourceSpec(),
      help_text,
      required=required,
  )
def AddDescribeDiscoveredServiceFlags(parser):
  GetDiscoveredServiceResourceArg().AddToParser(parser)
def AddListDiscoveredServiceFlags(parser):
  GetLocationResourceArg().AddToParser(parser)
def AddFindUnregisteredServiceFlags(parser):
  GetLocationResourceArg().AddToParser(parser)
def AddFindDiscoveredServiceFlags(parser):
  GetLocationResourceArg().AddToParser(parser)
def AddLookupDiscoveredServiceFlags(parser):
  GetLocationResourceArg().AddToParser(parser)
  parser.add_argument(
      '--uri',
      metavar='URI',
      dest='resource_uri',
      required=True,
      help='Google Cloud Platform resource URI to look up service for.',
  )
def AddDescribeDiscoveredWorkloadFlags(parser):
  GetDiscoveredWorkloadResourceArg().AddToParser(parser)
def AddListDiscoveredWorkloadFlags(parser):
  GetLocationResourceArg().AddToParser(parser)
def AddFindUnregisteredWorkloadFlags(parser):
  GetLocationResourceArg().AddToParser(parser)
def AddFindDiscoveredWorkloadFlags(parser):
  GetLocationResourceArg().AddToParser(parser)
def AddLookupDiscoveredWorkloadFlags(parser):
  GetLocationResourceArg().AddToParser(parser)
  parser.add_argument(
      '--uri',
      metavar='URI',
      dest='resource_uri',
      required=True,
      help='Google Cloud Platform resource URI to look up workload for.',
  )
def AddDeleteApplicationFlags(parser):
  GetApplicationResourceArg().AddToParser(parser)
  parser.add_argument(
      '--async',
      dest='async_',
      action='store_true',
      default=False,
      help=(
          'Return immediately, without waiting for the operation in progress to'
          ' complete.'
      ),
  )
def GetOperationResourceSpec(arg_name='operation', help_text=None):
  """Constructs and returns the Resource specification for Operation."""
  def OperationAttributeConfig():
    return concepts.ResourceParameterAttributeConfig(
        name=arg_name,
        help_text=help_text,
    )
  return concepts.ResourceSpec(
      'apphub.projects.locations.operations',
      resource_name='operation',
      operationsId=OperationAttributeConfig(),
      projectsId=concepts.DEFAULT_PROJECT_ATTRIBUTE_CONFIG,
      locationsId=LocationAttributeConfig(),
  )
def GetOperationResourceArg(
    arg_name='operation', help_text=None, positional=True, required=True
):
  """Constructs and returns the Operation Resource Argument."""
  help_text = help_text or 'The Operation ID.'
  return concept_parsers.ConceptParser.ForResource(
      '{}{}'.format('' if positional else '--', arg_name),
      GetOperationResourceSpec(),
      help_text,
      required=required,
  )
def AddDescribeOperationFlags(parser):
  GetOperationResourceArg().AddToParser(parser)
def AddListOperationsFlags(parser):
  GetLocationResourceArg().AddToParser(parser)
def AddListApplicationWorkloadFlags(parser):
  GetApplicationResourceArg(positional=False).AddToParser(parser)
def AddDescribeApplicationWorkloadFlags(parser):
  GetApplicationWorkloadResourceArg().AddToParser(parser)
def AddDeleteApplicationWorkloadFlags(parser):
  GetApplicationWorkloadResourceArg().AddToParser(parser)
  parser.add_argument(
      '--async',
      dest='async_',
      action='store_true',
      default=False,
      help=(
          'Return immediately, without waiting for the operation in progress to'
          ' complete.'
      ),
  )
def AddCreateApplicationWorkloadFlags(
    parser, release_track=base.ReleaseTrack.ALPHA
):
  """Adds flags required to create an application workload."""
  concept_parsers.ConceptParser(
      [
          presentation_specs.ResourcePresentationSpec(
              'WORKLOAD',
              GetApplicationWorkloadResourceSpec(),
              'The Workload resource.',
              flag_name_overrides={
                  'location': '--location',
                  'application': '--application',
              },
              prefixes=True,
              required=True,
          ),
          presentation_specs.ResourcePresentationSpec(
              '--discovered-workload',
              GetDiscoveredWorkloadResourceSpec(),
              'The discovered workload resource.',
              # This hides the location flag for discovered resource.
              flag_name_overrides={
                  'location': '',
                  'project': '',
              },
              prefixes=True,
              required=True,
          ),
      ],
      # This configures the fallthrough from the
      # discovered workload's location to
      # the primary flag for the WORKLOAD's location.
      command_level_fallthroughs={
          '--discovered-workload.location': ['WORKLOAD.location'],
      },
  ).AddToParser(parser)
  AddAttributesFlags(
      parser, resource_name='workload', release_track=release_track
  )
  parser.add_argument('--display-name', help='Human-friendly display name')
  parser.add_argument('--description', help='Description of the Workload')
  parser.add_argument(
      '--async',
      dest='async_',
      action='store_true',
      default=False,
      help=(
          'Return immediately, without waiting for the operation in progress to'
          ' complete.'
      ),
  )
def AddUpdateApplicationWorkloadFlags(
    parser, release_track=base.ReleaseTrack.ALPHA
):
  """Adds flags required to update an application workload."""
  GetApplicationWorkloadResourceArg().AddToParser(parser)
  AddAttributesFlags(
      parser, resource_name='workload', release_track=release_track
  )
  parser.add_argument('--display-name', help='Human-friendly display name')
  parser.add_argument('--description', help='Description of the Workload')
  parser.add_argument(
      '--async',
      dest='async_',
      action='store_true',
      default=False,
      help=(
          'Return immediately, without waiting for the operation in progress to'
          ' complete.'
      ),
  )
def AddAttributesFlags(
    parser, resource_name='application', release_track=base.ReleaseTrack.ALPHA
):
  """Adds flags required for attributes fields."""
  parser.add_argument(
      '--criticality-type',
      choices={
          'TYPE_UNSPECIFIED': 'Unspecified criticality type',
          'MISSION_CRITICAL': (
              'Mission critical service, application or workload'
          ),
          'HIGH': 'High impact',
          'MEDIUM': 'Medium impact',
          'LOW': 'Low impact',
      },
      help='Criticality Type of the {}'.format(resource_name),
  )
  parser.add_argument(
      '--environment-type',
      choices={
          'TYPE_UNSPECIFIED': 'Unspecified environment type',
          'PRODUCTION': 'Production environment',
          'STAGING': 'Staging environment',
          'TEST': 'Test environment',
          'DEVELOPMENT': 'Development environment',
      },
      help='Environment Type of the {}'.format(resource_name),
  )
  if release_track == base.ReleaseTrack.ALPHA:
    parser.add_argument(
        '--business-owners',
        type=arg_parsers.ArgDict(
            spec={
                'display-name': str,
                'email': str,
                'channel-uri': str,
            },
            required_keys=['email'],
        ),
        action='append',
        help='Business owners of the {}'.format(resource_name),
    )
    parser.add_argument(
        '--developer-owners',
        type=arg_parsers.ArgDict(
            spec={
                'display-name': str,
                'email': str,
                'channel-uri': str,
            },
            required_keys=['email'],
        ),
        action='append',
        help='Developer owners of the {}'.format(resource_name),
    )
    parser.add_argument(
        '--operator-owners',
        type=arg_parsers.ArgDict(
            spec={
                'display-name': str,
                'email': str,
                'channel-uri': str,
            },
            required_keys=['email'],
        ),
        action='append',
        help='Operator owners of the {}'.format(resource_name),
    )
  elif release_track == base.ReleaseTrack.GA:
    parser.add_argument(
        '--business-owners',
        type=arg_parsers.ArgDict(
            spec={
                'display-name': str,
                'email': str,
            },
            required_keys=['email'],
        ),
        action='append',
        help='Business owners of the {}'.format(resource_name),
    )
    parser.add_argument(
        '--developer-owners',
        type=arg_parsers.ArgDict(
            spec={
                'display-name': str,
                'email': str,
            },
            required_keys=['email'],
        ),
        action='append',
        help='Developer owners of the {}'.format(resource_name),
    )
    parser.add_argument(
        '--operator-owners',
        type=arg_parsers.ArgDict(
            spec={
                'display-name': str,
                'email': str,
            },
            required_keys=['email'],
        ),
        action='append',
        help='Operator owners of the {}'.format(resource_name),
    )
def AddListApplicationServiceFlags(parser):
  GetApplicationResourceArg(positional=False).AddToParser(parser)
def AddDescribeApplicationServiceFlags(parser):
  GetApplicationServiceResourceArg().AddToParser(parser)
def AddDeleteApplicationServiceFlags(parser):
  GetApplicationServiceResourceArg().AddToParser(parser)
  parser.add_argument(
      '--async',
      dest='async_',
      action='store_true',
      default=False,
      help=(
          'Return immediately, without waiting for the operation in progress to'
          ' complete.'
      ),
  )
def AddCreateApplicationServiceFlags(
    parser, release_track=base.ReleaseTrack.ALPHA
):
  """Adds flags required to create an application service."""
  concept_parsers.ConceptParser(
      [
          presentation_specs.ResourcePresentationSpec(
              'SERVICE',
              GetApplicationServiceResourceSpec(),
              'The Service resource.',
              flag_name_overrides={
                  'location': '--location',
                  'application': '--application',
              },
              prefixes=True,
              required=True,
          ),
          presentation_specs.ResourcePresentationSpec(
              '--discovered-service',
              GetDiscoveredServiceResourceSpec(),
              'The discovered service resource.',
              # This hides the location flag for discovered resource.
              flag_name_overrides={
                  'location': '',
                  'project': '',
              },
              prefixes=True,
              required=True,
          ),
      ],
      # This configures the fallthrough from the
      # discovered service's location to
      # the primary flag for the SERVICE's location.
      command_level_fallthroughs={
          '--discovered-service.location': ['SERVICE.location'],
      },
  ).AddToParser(parser)
  AddAttributesFlags(
      parser, resource_name='service', release_track=release_track
  )
  parser.add_argument('--display-name', help='Human-friendly display name')
  parser.add_argument('--description', help='Description of the service')
  parser.add_argument(
      '--async',
      dest='async_',
      action='store_true',
      default=False,
      help=(
          'Return immediately, without waiting for the operation in progress to'
          ' complete.'
      ),
  )
def AddUpdateApplicationServiceFlags(
    parser, release_track=base.ReleaseTrack.ALPHA
):
  """Adds flags required to update an application service."""
  GetApplicationServiceResourceArg().AddToParser(parser)
  AddAttributesFlags(
      parser, resource_name='service', release_track=release_track
  )
  parser.add_argument('--display-name', help='Human-friendly display name')
  parser.add_argument('--description', help='Description of the service')
  parser.add_argument(
      '--async',
      dest='async_',
      action='store_true',
      default=False,
      help=(
          'Return immediately, without waiting for the operation in progress to'
          ' complete.'
      ),
  )
def AddGetIamPolicyFlags(parser):
  GetApplicationResourceArg().AddToParser(parser)
def AddAddIamPolicyBindingFlags(parser):
  GetApplicationResourceArg().AddToParser(parser)
def AddRemoveIamPolicyBindingFlags(parser):
  GetApplicationResourceArg().AddToParser(parser)
def AddSetIamPolicyFlags(parser):
  GetApplicationResourceArg().AddToParser(parser)
def AddDescribeLocationFlags(parser):
  GetLocationResourceArg(positional=True).AddToParser(parser)