gce_rescue/tasks/validations/authentication.py (67 lines of code) (raw):
# Copyright 2021 Google LLC
#
# 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.
""" Authentication validation to be called from ../pre_validations.py """
import google.auth
import sys
from googleapiclient.discovery import Resource
from gce_rescue.tasks.validations.api import api_service
from gce_rescue.test.mocks import mock_api_object
PROJECT = ''
def _get_auth():
global PROJECT
try:
credentials, adc_project = google.auth.default()
if not adc_project and not PROJECT:
msg = _info_no_project()
print(msg, file=sys.stderr)
sys.exit(1)
if not PROJECT and adc_project:
PROJECT = adc_project
return credentials
except google.auth.exceptions.DefaultCredentialsError:
msg = _info_auth_cred()
print(msg, file=sys.stderr)
sys.exit(1)
def authenticate_check(
zone: str,
instance_name: str,
project: str = None,
test_mode: bool = False
) -> Resource:
global PROJECT
PROJECT = project
if test_mode:
service = mock_api_object(['compute'])
return service
credentials = _get_auth()
if not credentials:
return False
# service = googleapiclient.discovery.build(
# 'compute',
# 'v1',
# credentials = credentials
# )
service = api_service('compute', 'v1', credentials)
request = service.instances().get(
project = PROJECT,
zone = zone,
instance = instance_name)
try:
request.execute()
return service
except google.auth.exceptions.RefreshError:
msg = _info_auth_refresh()
print(msg, file=sys.stderr)
sys.exit(1)
def project_name() -> str:
return PROJECT
def _info_auth_refresh() -> str:
return (
' Please use application-default Credentials (ADC) to authenticate:\n'
' $ gcloud auth login --update-adc'
)
def _info_auth_cred() -> str:
return (
' Please use application-default Credentions (ADC) to authenticate:\n'
' $ gcloud auth application-default login\n'
f' $ gcloud auth application-default set-quota-project {PROJECT}'
)
def _info_no_project() -> str:
return (
' Was not possible to find the project where the VM is created.\n'
' You can use the option --project to declare the project-id or '
'set to your configuration:\n'
' $ gcloud config set project PROJECT_ID'
)