HEX
Server: Apache/2.4.65 (Ubuntu)
System: Linux ielts-store-v2 6.8.0-1036-gcp #38~22.04.1-Ubuntu SMP Thu Aug 14 01:19:18 UTC 2025 x86_64
User: root (0)
PHP: 7.2.34-54+ubuntu20.04.1+deb.sury.org+1
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,
Upload Files
File: //snap/google-cloud-cli/394/lib/googlecloudsdk/command_lib/artifacts/endpoint_util.py
# -*- 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.
# Lint as: python3
"""Utilities for operating on different endpoints."""

import contextlib
from googlecloudsdk.api_lib.artifacts import exceptions as ar_exceptions
from googlecloudsdk.core import properties

# Rerouted regions are regions that don't have a regional endpoint
# and must be redirected to global region.
# go/rep-deployment-roadmap, go/rep-dashboards
_CONTAINER_ANALYSIS_REROUTED_LOCATIONS = frozenset([
    # TODO(b/445909332): REP is available. Turn up CA API RSLB.
    # go/keep-sorted start
    "eu",
    "europe-north2",
    "europe-west12",
    "northamerica-south1",
    "us",
    "us-west8",
    # go/keep-sorted end
    # No REP available.
    # go/keep-sorted start
    "asia",
    "asia-southeast3",
    "europe-west15",
    "global"
    # go/keep-sorted end
])

# Direct locations are regions and multi-regions that have regional endpoints.
_CONTAINER_ANALYSIS_DIRECT_LOCATIONS = frozenset([
    # go/keep-sorted start
    "africa-south1",
    "asia-east1",
    "asia-east2",
    "asia-northeast1",
    "asia-northeast2",
    "asia-northeast3",
    "asia-south1",
    "asia-south2",
    "asia-southeast1",
    "asia-southeast2",
    "australia-southeast1",
    "australia-southeast2",
    "europe-central2",
    "europe-north1",
    "europe-southwest1",
    "europe-west1",
    "europe-west10",
    "europe-west2",
    "europe-west3",
    "europe-west4",
    "europe-west6",
    "europe-west8",
    "europe-west9",
    "me-central1",
    "me-central2",
    "me-west1",
    "northamerica-northeast1",
    "northamerica-northeast2",
    "southamerica-east1",
    "southamerica-west1",
    "us-central1",
    "us-central2",
    "us-east1",
    "us-east4",
    "us-east5",
    "us-east7",
    "us-south1",
    "us-west1",
    "us-west2",
    "us-west3",
    "us-west4",
    # go/keep-sorted end
])

_CONTAINER_ANALYSIS_REP_STRUCTURE = "https://containeranalysis.{}.rep.{}/"
_ARTIFACT_REGISTRY_FACADE_STRUCTURE = "{protocol}{prefix}{location}-{format}.{domain}"
_ARTIFACT_REGISTRY_FACADE_REP_STRUCTURE = "{protocol}{prefix}{format}.{location}.rep.{domain}"


def _GetRegionalEndpoint(region):
  universe_domain = properties.VALUES.core.universe_domain.Get()
  regional_endpoint = _CONTAINER_ANALYSIS_REP_STRUCTURE.format(
      region, universe_domain
  )
  return regional_endpoint


@contextlib.contextmanager
def WithRegion(region=None):
  """WithRegion overrides artifact analysis endpoint with endpoint of region.

  A call to WithRegion should be done in a with clause.
  If an existing override exists, this command does not do anything.
  If a rerouted region is passed in, this command does not do anything.
  An error is raised if an invalid location is passed in.

  Args:
    region: str, location

  Raises:
    aa_exceptions.UnsupportedLocationError if location provided is invalid.

  Yields:
    None
  """
  override = properties.VALUES.api_endpoint_overrides.containeranalysis.Get()
  if region is None:
    pass
  elif (
      region not in _CONTAINER_ANALYSIS_DIRECT_LOCATIONS
      and region not in _CONTAINER_ANALYSIS_REROUTED_LOCATIONS
  ):
    raise ar_exceptions.UnsupportedLocationError()
  elif (
      override is None and region not in _CONTAINER_ANALYSIS_REROUTED_LOCATIONS
  ):
    regional_endpoint = _GetRegionalEndpoint(region)
    properties.VALUES.api_endpoint_overrides.containeranalysis.Set(
        regional_endpoint
    )
  try:
    yield
  finally:
    properties.VALUES.api_endpoint_overrides.containeranalysis.Set(override)


def ArtifactRegistryDomainEndpoint(
    location, repo_format, protocol="", rep=False,
):
  """Returns the Artifact Registry domain endpoint for the given region."""
  # TODO(b/399155579): read from universe descriptor once AR is added.
  domain = "pkg.dev"
  prefix = properties.VALUES.artifacts.registry_endpoint_prefix.Get()
  if protocol:
    if protocol != "https" and protocol != "http":
      raise ar_exceptions.ArtifactRegistryError(
          "Invalid protocol: {}, must be https or http".format(protocol)
      )
    protocol = protocol + "://"
  template = (
      _ARTIFACT_REGISTRY_FACADE_REP_STRUCTURE
      if rep
      else _ARTIFACT_REGISTRY_FACADE_STRUCTURE
  )
  return template.format(
      protocol=protocol,
      prefix=prefix,
      location=location,
      format=repo_format,
      domain=domain,
  )