File: //snap/google-cloud-cli/394/lib/googlecloudsdk/api_lib/util/api_enablement.py
# -*- coding: utf-8 -*- #
# Copyright 2021 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 API enablement."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
import re
from googlecloudsdk.api_lib.services import enable_api
from googlecloudsdk.core.console import console_io
API_ENABLEMENT_REGEX = re.compile(
'.*Enable it by visiting https://console.(?:cloud|developers).google.com'
'/apis/api/([^/]+)/overview\\?project=(\\S+) then retry. If you '
'enabled this API recently, wait a few minutes for the action to propagate'
' to our systems and retry.\\w*')
_PROJECTS_NOT_TO_ENABLE = {'google.com:cloudsdktool'}
def ShouldAttemptProjectEnable(project):
return project not in _PROJECTS_NOT_TO_ENABLE
def GetApiEnablementInfo(status_message):
"""Parses error message for API enablement messages.
Args:
status_message: str, error message to parse.
Returns:
tuple[str]: The project, service token to be used for prompting to enable
the API.
"""
match = API_ENABLEMENT_REGEX.match(status_message)
if match:
(project, service_token) = (match.group(2), match.group(1))
if (project is not None and ShouldAttemptProjectEnable(project)
and service_token is not None):
return (project, service_token)
return None
def PromptToEnableApi(project, service_token, enable_by_default=False):
"""Prompts to enable the API.
Args:
project (str): The project that the API is not enabled on.
service_token (str): The service token of the API to prompt for.
enable_by_default (bool): The default choice for the enablement prompt.
Returns:
bool, whether or not the API was attempted to be enabled
"""
api_enable_attempted = console_io.PromptContinue(
default=enable_by_default,
prompt_string=('API [{}] not enabled on project [{}]. '
'Would you like to enable and retry (this will take a '
'few minutes)?').format(service_token, project))
if api_enable_attempted:
enable_api.EnableService(project, service_token)
return api_enable_attempted