File: //snap/google-cloud-cli/current/lib/googlecloudsdk/api_lib/run/api_enabler.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.
"""Utilities for checking and enabling necessary APIs."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
import urllib.parse as urlparse
from googlecloudsdk.api_lib.services import enable_api
from googlecloudsdk.api_lib.services import services_util
from googlecloudsdk.api_lib.services import serviceusage
from googlecloudsdk.api_lib.services.exceptions import GetServicePermissionDeniedException
from googlecloudsdk.core import log
from googlecloudsdk.core import properties
from googlecloudsdk.core.console import console_io
_RUN_API_NAMES = frozenset(
['run.googleapis.com', 'staging-run.sandbox.googleapis.com']
)
def get_run_api():
endpoint = properties.VALUES.api_endpoint_overrides.run.Get()
if endpoint:
api = urlparse.urlparse(endpoint).hostname
if api in _RUN_API_NAMES:
return api
return 'run.googleapis.com'
def check_and_enable_apis(project_id, required_apis):
"""Ensure the given APIs are enabled for the specified project."""
if not properties.VALUES.core.should_prompt_to_enable_api.GetBool():
# no need to even check if prompting is disabled.
return False
try:
apis_not_enabled = get_disabled_apis(project_id, required_apis)
except GetServicePermissionDeniedException:
return False
if apis_not_enabled:
apis_to_enable = '\n\t'.join(apis_not_enabled)
console_io.PromptContinue(
default=True,
cancel_on_no=True,
message=(
'The following APIs are not enabled on project [{0}]:\n\t{1}'
.format(project_id, apis_to_enable)
),
prompt_string='Do you want enable these APIs to '
+ 'continue (this will take a few minutes)?',
)
log.status.Print('Enabling APIs on project [{0}]...'.format(project_id))
op = serviceusage.BatchEnableApiCall(project_id, apis_not_enabled)
if not op.done:
op = services_util.WaitOperation(op.name, serviceusage.GetOperation)
services_util.PrintOperation(op)
return True
def get_disabled_apis(project_id, required_apis):
apis_not_enabled = [
# iterable is sorted for scenario tests. The order of API calls
# should happen in the same order each time for the scenario tests.
api
for api in sorted(required_apis)
if not enable_api.IsServiceEnabled(project_id, api)
]
return apis_not_enabled